PYQT5中QTableWidget的使用!
4 人贊了文章
如果大家使用PYTHON來進行GUI編程,那一般會用到PYQT,非常強大的GUI工具,但很少有教程,所有的官方文檔和第三方教程,都是C++版本的,只能從C++中來查看用法。
最近做東西的時候用到了QTableWidget這個控制項,踩了一些坑,也發現了一些BUG,讓我們來看看,這個控制項如何來使用吧。
先是一些簡單的說明:
from PyQt5.QtWidgets import QTableWidget,QFrame,QAbstractItemViewfrom PyQt5.QtGui import QFontfrom PyQt5.QtCore import Qt#增加一個tabletable = QTableWidget()font = QFont(微軟雅黑, 20)font.setBold(True) #設置字體加粗table.horizontalHeader().setFont(font) #設置表頭字體為font設置的字體樣式 table.setFrameShape(QFrame.NoFrame) ##設置無表格的外框table.horizontalHeader().setFixedHeight(50) ##設置表頭高度table.horizontalHeader().setSectionResizeMode(4,QHeaderView.Stretch)#設置第五列寬度自動調整,充滿屏幕table.horizontalHeader().setStretchLastSection(True) ##設置最後一列拉伸至最大table.setSelectionMode(QAbstractItemView.SingleSelection) #設置只可以單選,可以使用ExtendedSelection進行多選table.setSelectionBehavior(QAbstractItemView.SelectRows) #設置 不可選擇單個單元格,只可選擇一行。table..horizontalHeader().resizeSection(0,200) #設置第一列的寬度為200table.setColumnCount(5)##設置表格一共有五列table.setHorizontalHeaderLabels([id,姓名,年齡,學號,地址])#設置表頭文字table.horizontalHeader().setSectionsClickable(False) #可以禁止點擊表頭的列table.sortItems(1,Qt.DescendingOrder) #設置按照第二列自動降序排序table.horizontalHeader().setStyleSheet(QHeaderView::section{background:green})#設置表頭的背景色為綠色table.setColumnHidden(1,True)#將第二列隱藏table.setEditTriggers(QAbstractItemView.NoEditTriggers) #設置表格不可更改table.setSortingEnabled(True)#設置表頭可以自動排序.....下面就看下簡易的演示例子:
##增加一行數據:帶有CHECKBOX,並使checkbox居中顯示,checkbox居中使用的方法是將checkbox加入QHboxLayout 使 QHboxLayout居中,將QHboxLayout加入一個QWidgetdef add_line(self): row = self.table.rowCount() self.table.setRowCount(row + 1) id = str(self.id) ##下面六行用於生成居中的checkbox,不知道有沒有別的好方法 ck = QCheckBox() h = QHBoxLayout() h.setAlignment(Qt.AlignCenter) h.addWidget(ck) w = QWidget() w.setLayout(h) name = self.faker.name() score = str(random.randint(50,99)) add = self.faker.address() self.table.setItem(row,0,QTableWidgetItem(id)) self.table.setCellWidget(row,1,w) self.table.setItem(row,2,QTableWidgetItem(name)) self.table.setItem(row,3,QTableWidgetItem(score)) self.table.setItem(row,4,QTableWidgetItem(add)) self.id += 1 self.lines.append([id,ck,name,score,add])
#2.刪除一行數據:使用了一個變數來存儲所有的表格數據,其實可以直接在表格中查找對應的行def del_line(self): removeline = [] for line in self.lines: if line[1].isChecked(): row = self.table.rowCount() for x in range(row,0,-1): if line[0] == self.table.item(x - 1,0).text(): self.table.removeRow(x - 1) removeline.append(line) for line in removeline: self.lines.remove(line)
def modify_line(self): if self.editable == True: self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.btn_modify.setText(禁止編輯) self.editable = False else: self.table.setEditTriggers(QAbstractItemView.AllEditTriggers) self.btn_modify.setText(可以編輯) self.editable = True self.settext(設置,是否可以編輯整個表格) def cellchange(self,row,col): item = self.table.item(row,col) txt = item.text()
4.設置標頭,文字居中,設置顏色等:
完整代碼:
from PyQt5.QtWidgets import QWidget,QHBoxLayout,QTableWidget,QPushButton,QApplication,QVBoxLayout,QTableWidgetItem,QCheckBox,QAbstractItemView,QHeaderView,QLabel,QFramefrom PyQt5 import QtWidgetsfrom PyQt5.QtCore import Qtfrom PyQt5.QtGui import QFont,QColorfrom faker import Factoryimport randomimport sysclass ui(QWidget): def __init__(self): super().__init__() self.setupUI() self.id = 1 self.lines = [] self.editable = True self.des_sort = True self.faker = Factory.create() self.btn_add.clicked.connect(self.add_line) self.btn_del.clicked.connect(self.del_line) self.btn_modify.clicked.connect(self.modify_line) self.btn_select_line.clicked.connect(self.select_line) self.btn_select_single.clicked.connect(self.deny_muti_line) self.btn_sort.clicked.connect(self.sortItem) self.btn_set_header.clicked.connect(self.setheader) self.btn_set_middle.clicked.connect(self.middle) self.table.cellChanged.connect(self.cellchange) self.btn_noframe.clicked.connect(self.noframe)# # Sess = sessionmaker(bind = engine) def setupUI(self): self.setWindowTitle(歡迎加入微信公眾號:python玩轉網路 ) self.resize(640,480) self.table = QTableWidget(self) self.btn_add = QPushButton(增加) self.btn_del = QPushButton(刪除) self.btn_modify = QPushButton(可以編輯) self.btn_select_line = QPushButton(選擇整行) self.btn_select_single = QPushButton(禁止選多行) self.btn_sort = QPushButton(以分數排序) self.btn_set_header = QPushButton(標頭設置) self.btn_set_middle = QPushButton(文字居中加顏色) self.btn_noframe = QPushButton(取消邊框顏色交替) self.spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.vbox = QVBoxLayout() self.vbox.addWidget(self.btn_add) self.vbox.addWidget(self.btn_del) self.vbox.addWidget(self.btn_modify) self.vbox.addWidget(self.btn_select_line) self.vbox.addWidget(self.btn_select_single) self.vbox.addWidget(self.btn_sort) self.vbox.addWidget(self.btn_set_header) self.vbox.addWidget(self.btn_set_middle) self.vbox.addWidget(self.btn_noframe) self.vbox.addSpacerItem(self.spacerItem) #可以用addItem也可以用addSpacerItem方法添加,沒看出哪裡不一樣 self.txt = QLabel() self.txt.setMinimumHeight(50) self.vbox2 = QVBoxLayout() self.vbox2.addWidget(self.table) self.vbox2.addWidget(self.txt) self.hbox = QHBoxLayout() self.hbox.addLayout(self.vbox2) self.hbox.addLayout(self.vbox) self.setLayout(self.hbox) self.table.setColumnCount(4) ##設置列數 self.headers = [id,選擇,姓名,成績,住址] self.table.setHorizontalHeaderLabels(self.headers) self.show() def add_line(self): self.table.cellChanged.disconnect() row = self.table.rowCount() self.table.setRowCount(row + 1) id = str(self.id) ck = QCheckBox() h = QHBoxLayout() h.setAlignment(Qt.AlignCenter) h.addWidget(ck) w = QWidget() w.setLayout(h) name = self.faker.name() score = str(random.randint(50,99)) add = self.faker.address() self.table.setItem(row,0,QTableWidgetItem(id)) self.table.setCellWidget(row,1,w) self.table.setItem(row,2,QTableWidgetItem(name)) self.table.setItem(row,3,QTableWidgetItem(score)) self.table.setItem(row,4,QTableWidgetItem(add)) self.id += 1 self.lines.append([id,ck,name,score,add]) self.settext(自動生成隨機一行數據!,checkbox設置為居中顯示) self.table.cellChanged.connect(self.cellchange) def del_line(self): removeline = [] for line in self.lines: if line[1].isChecked(): row = self.table.rowCount() for x in range(row,0,-1): if line[0] == self.table.item(x - 1,0).text(): self.table.removeRow(x - 1) removeline.append(line) for line in removeline: self.lines.remove(line) self.settext(刪除在左邊checkbox中選中的行,使用了一個笨辦法取得行號
,不知道有沒有其他可以直接取得行號的方法!) def modify_line(self): if self.editable == True: self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.btn_modify.setText(禁止編輯) self.editable = False else: self.table.setEditTriggers(QAbstractItemView.AllEditTriggers) self.btn_modify.setText(可以編輯) self.editable = True self.settext(設置,是否可以編輯整個表格) def select_line(self): if self.table.selectionBehavior() == 0: self.table.setSelectionBehavior(1) self.btn_select_line.setStyleSheet(background-color:lightblue) else: self.table.setSelectionBehavior(0) self.btn_select_line.setStyleSheet() self.settext(默認時,點擊單元格,只可選擇一個格,此處設置為可選擇整行) def deny_muti_line(self): if self.table.selectionMode() in [2,3]: self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.btn_select_single.setStyleSheet(background-color:lightblue) else: self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.btn_select_single.setStyleSheet() self.settext(點擊時會輪換以多行或單行選擇,默認是可以同時選擇多行) def sortItem(self): if self.des_sort == True: self.table.sortItems(3,Qt.DescendingOrder) self.des_sort = False self.btn_sort.setStyleSheet(background-color:lightblue) self.table.setSortingEnabled(True) # 設置表頭可以自動排序 else: self.table.sortItems(3,Qt.AscendingOrder) self.des_sort = True self.btn_sort.setStyleSheet(background-color:lightblue) self.table.setSortingEnabled(False) self.settext(點擊時會輪換以升序降序排列,但排序時,會使自動列寬失效!) def setheader(self): font = QFont(微軟雅黑, 12) font.setBold(True) self.table.horizontalHeader().setFont(font) # 設置表頭字體 self.table.setColumnWidth(0,50) self.table.setColumnWidth(1,50) self.table.setColumnWidth(3,100) self.table.horizontalHeader().setSectionResizeMode(2,QHeaderView.Stretch) self.table.horizontalHeader().setStyleSheet(QHeaderView::section{background:gray}) self.table.horizontalHeader().setFixedHeight(50) self.table.setColumnHidden(0,True) self.btn_set_header.setStyleSheet(background-color:lightblue) self.settext(設置標頭字體及字型大小,隱藏ID列,設置標頭除姓名外全部為固定寬度
,設置姓名列自動擴展寬度,設置標頭行高,設置標頭背景色) def middle(self): self.btn_set_middle.setStyleSheet(background-color:lightblue) self.table.setStyleSheet(color:green;) row = self.table.rowCount() for x in range(row): for y in range(4): if y != 1: item = self.table.item(x,y) item.setTextAlignment(Qt.AlignCenter) else: pass self.btn_set_middle.setStyleSheet(background-color:lightblue) self.settext(將文字居中顯示,設置文字顏色) def cellchange(self,row,col): item = self.table.item(row,col) txt = item.text() self.settext(第%s行,第%s列 , 數據改變為:%s%(row,col,txt)) def noframe(self): self.table.setAlternatingRowColors(True) self.table.setFrameStyle(QFrame.NoFrame) self.table.setStyleSheet(color:green; gridline-color:white; border:0px solid gray) self.settext(取消表的框線,
取消表格內框) def settext(self,txt): font = QFont(微軟雅黑,10) self.txt.setFont(font) self.txt.setText(txt)if __name__ == __main__: app = QApplication(sys.argv) ui = ui() sys.exit(app.exec_())
歡迎大家關注微信公眾號:python玩轉網路
http://weixin.qq.com/r/jEPy6nDEdi0JrTSJ9xae (二維碼自動識別)
推薦閱讀:
※PyQt5.7如何安裝?題主已昏迷。
※PyQt5系列教程(45):像QQ一樣選擇好友(QComboBox的使用,補充前一章節的知識點)
※將 matplotlib 嵌入 PyQt5
※PyQt5系列教程(42):TIM模擬(QTreeWidget的使用)3
※趁年輕,又折騰了一把音樂播放器 =。=