지난번 탭 위젯의 두번째 탭에, QTableWidget을 사용해 테이블을 추가해 보도록 하겠습니다.
테이블의 데이터는 csv 파일로부터 읽도록 합니다.
결과 화면 :
소스 코드 :
TabWidgetB 클래스에 아래의 내용을 추가합니다.
- QTableWidget을 추가합니다.
- setRowCount와 setColumnCount로 몇 행 몇 열의 테이블인지를 지정해 주어야 합니다.
(데이터 파일의 총 line 수를 table의 rowCount로, 한 라인 안의 데이터 수를 table의 colCount로 설정합니다.) - setHorizontalHeaderLabels 로 테이블 헤더를 만들어 줍니다.
- setRowCount와 setColumnCount로 몇 행 몇 열의 테이블인지를 지정해 주어야 합니다.
- csv 파일에서 데이터를 읽습니다. (,로 구분된 파일)
- 각 row, col에 읽은 데이터를 item으로 추가합니다.
- 아래에서는, (0,0) 셀부터 (2,2)셀까지 각 QTableWidgetItem을 만들어 추가해 주었습니다.
- 필요하다면, setStyleSheet으로 헤더와 각 셀의 스타일을 지정합니다.
# qt/tabwidget/TabWidget.py
class TabWidgetB(QWidget):
def __init__(self):
QWidget.__init__(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setMinimumSize(500, 200)
self.tableWidget.setColumnCount(3)
self.tableWidget.setHorizontalHeaderLabels(["header-1", "header-2", "header-3"])
# read data from file
# 경로는 본인 파일이 있는 경로로 설정
# (main 함수가 있는 .py 파일 위치부터의 경로)
with open('venv/qt/tabwidget/data/tab.csv', 'r', encoding='utf-8') as f:
data = f.readlines()
# Set data to tableWidget
self.tableWidget.setRowCount(len(data))
rowIdx = 0
for line in data:
cells = line.split(",")
for colIdx in range(len(cells)):
item = QTableWidgetItem(cells[colIdx])
self.tableWidget.setItem(rowIdx, colIdx, item)
rowIdx += 1
self.tableWidget.setStyleSheet("QHeaderView::section {font-size:22px;}"
"QTableWidget {font-size:22px;} "
"QTableWidget::item{border-bottom:1px solid #fff; border-right:1px solid #fff;}")
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
vBox = QVBoxLayout(self)
vBox.addWidget(self.tableWidget)
self.setLayout(vBox)
아래는 탭 위젯에 사진 탭, 테이블 탭을 추가한 전체 소스코드 입니다.
1. qt/tabwidget/TabWidget.py
# qt/tabwidget/TabWidget.py
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QTabWidget, \
QVBoxLayout, QScrollArea, QDialog, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
class TabDialog(QDialog):
def __init__(self):
QDialog.__init__(self)
self.setWindowTitle("Tab Dialog")
# Tab widget
self.tabWidget = QTabWidget(self)
self.tabWidget.addTab(TabWidgetA(), "tab1")
self.tabWidget.addTab(TabWidgetB(), "tab2")
self.tabWidget.setStyleSheet("QTabBar {font-size:30px;}")
self.label = QLabel(self)
self.label.setText("Title")
self.label.setStyleSheet("font-size:40px; font-weight: bold;")
self.label.setAlignment(Qt.AlignCenter)
self.mainLayout = QVBoxLayout(self)
self.mainLayout.addWidget(self.label, Qt.AlignHCenter)
self.mainLayout.addWidget(self.tabWidget)
self.setLayout(self.mainLayout)
self.resize(600,400)
class TabWidgetA(QWidget):
def __init__(self):
QWidget.__init__(self)
mainLayout = QVBoxLayout(self)
self.label = QLabel(self)
self.label.setText("Label text")
self.scroll = QScrollArea(self)
widget = QWidget()
vBox = QVBoxLayout()
for name in ('0001', '0002', '0003'):
pixmap = QPixmap("venv/qt/tabwidget/data/{}.jpg".format(name))
label = QLabel(self)
label.setPixmap(pixmap)
label.resize(pixmap.width(), pixmap.height())
vBox.addWidget(label)
widget.setLayout(vBox)
self.scroll.setWidget(widget)
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setWidgetResizable(True)
mainLayout.addWidget(self.label)
mainLayout.addWidget(self.scroll)
self.setLayout(mainLayout)
class TabWidgetB(QWidget):
def __init__(self):
QWidget.__init__(self)
self.tableWidget = QTableWidget(self)
self.tableWidget.setMinimumSize(500, 200)
self.tableWidget.setColumnCount(3)
self.tableWidget.setHorizontalHeaderLabels(["header-1", "header-2", "header-3"])
# read data from file
with open('venv/qt/tabwidget/data/tab.csv', 'r', encoding='utf-8') as f:
data = f.readlines()
# Set data to tableWidget
self.tableWidget.setRowCount(len(data))
rowIdx = 0
for line in data:
cells = line.split(",")
for colIdx in range(len(cells)):
item = QTableWidgetItem(cells[colIdx])
self.tableWidget.setItem(rowIdx, colIdx, item)
rowIdx += 1
self.tableWidget.setStyleSheet("QHeaderView::section {font-size:22px;}"
"QTableWidget {font-size:22px;} "
"QTableWidget::item{border-bottom:1px solid #fff; border-right:1px solid #fff;}")
self.tableWidget.resizeColumnsToContents()
self.tableWidget.resizeRowsToContents()
vBox = QVBoxLayout(self)
vBox.addWidget(self.tableWidget)
self.setLayout(vBox)
2. main.py
# main.py
from qt.tabwidget.TabWidget import * # 본인의 소스파일이 있는 경로를 적고 import해주세요
import sys
def start():
app = QApplication(sys.argv)
tabDialog = TabDialog()
tabDialog.show()
sys.exit(app.exec_())
if __name__ == '__main__':
start()
연결된 글 보기 :
[PyQt] Python에서 QTabWidget(탭 위젯) 사용하기
[PyQt] 스크롤 가능한 영역(ScrollArea)에 사진 추가하기
'개발 > Qt' 카테고리의 다른 글
[PyQt] StyleSheet 사용해서 QComboBox 색상 변경 (0) | 2021.11.06 |
---|---|
[PyQt] 트리 뷰(QTreeView)에 콤보박스(QComboBox) 추가하기 (0) | 2021.11.03 |
[PyQt] QTreeView에서 각 아이템마다 다른 툴팁 설정하기 (0) | 2021.11.01 |
[PyQt] 스크롤 가능한 영역(ScrollArea)에 사진 추가하기 (0) | 2021.10.28 |
[PyQt] Python에서 QTabWidget(탭 위젯) 사용하기 (0) | 2021.10.26 |