Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
目錄
1、QTableView類
2、QListView類
3、QListWidet類
4、QTableWidget類
5、QTreeWidget和QTreeWidgetltem類
表格與樹解決的問題是如何在一個(gè)控件中有規(guī)律地呈現(xiàn)更多的數(shù)據(jù)。PyQt提供了兩種控件類用于解決該問題,其中一種是表格結(jié)構(gòu)的控件類,另一種是樹形結(jié)構(gòu)的控件類。
1、QTableView類
在通常情況下,一個(gè)應(yīng)用需要和一批數(shù)據(jù)(比如數(shù)組、列表)進(jìn)行交互,然后以表格的形式輸出這些信息,這時(shí)就要用到QTableView類了。在QtableView中可以使用自定義的數(shù)據(jù)模型來顯示內(nèi)容,通過setModel來綁定數(shù)據(jù)源。
QTableWidget繼承自QTableView,主要區(qū)別是QTableView可以使用自定義的數(shù)據(jù)模型來顯示內(nèi)容(先要通過setModel來綁定數(shù)據(jù)源),而QTableWidget只能使用標(biāo)準(zhǔn)的數(shù)據(jù)模型,并且其單元格數(shù)據(jù)是通過QTableWidgetltem對(duì)象來實(shí)現(xiàn)的。通常使用QTableWidget就能夠滿足我們的要求。
QTableView控件可以綁定一個(gè)模型數(shù)據(jù)用來更新控件上的內(nèi)容,可用的模式如下表所示:
通過示例了解QTableView類的使用方法,效果如下所示:
實(shí)現(xiàn)代碼如下所示:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sysclass Table(QWidget):def __init__(self, arg=None):super(Table, self).__init__(arg)self.setWindowTitle("QTableView表格視圖控件的例子") self.resize(500,300);self.model=QStandardItemModel(4,4);self.model.setHorizontalHeaderLabels(['標(biāo)題1','標(biāo)題2','標(biāo)題3','標(biāo)題4'])for row in range(4):for column in range(4):item = QStandardItem("row %s, column %s"%(row,column))self.model.setItem(row, column, item)self.tableView=QTableView()self.tableView.setModel(self.model)#下面代碼讓表格100填滿窗口#self.tableView.horizontalHeader().setStretchLastSection(True)#self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)dlgLayout=QVBoxLayout();dlgLayout.addWidget(self.tableView)self.setLayout(dlgLayout)if __name__ == '__main__':app = QApplication(sys.argv) table = Table()table.show()sys.exit(app.exec_())
2、QListView類
QListView類用于展示數(shù)據(jù),它的子類是QListWidget類。QListView是基于模型(Model)的,需要程序來建立模型,然后再保存數(shù)據(jù)。
QListWidget是一個(gè)升級(jí)版本的QListView,它已經(jīng)建立了一個(gè)數(shù)據(jù)存儲(chǔ)模(QListWidgetltem),直接調(diào)用addltem()函數(shù),就可以添加條目(ltem)。
QListView類中的常用方法如下表所示:
QListView類中的常用信號(hào)如下表所示:?
通過示例了解QListView類的使用方法,效果如下所示:
示例中,將QListView控件的clicked信號(hào)與自定義對(duì)象的clicked()槽函數(shù)進(jìn)行綁定,當(dāng)單擊QListView控件里Model中的一項(xiàng)時(shí)會(huì)彈出消息框(提示選擇的是哪─項(xiàng))。
實(shí)現(xiàn)代碼如下所示:
from PyQt5.QtWidgets import QApplication, QWidget , QVBoxLayout , QListView, QMessageBox
from PyQt5.QtCore import QStringListModel
import sys class ListViewDemo(QWidget):def __init__(self, parent=None):super(ListViewDemo, self).__init__(parent)self.setWindowTitle("QListView 例子")self.resize(300, 270) layout = QVBoxLayout()listView = QListView() slm = QStringListModel();self.qList = ['Pyhon語言','C語言','C++語言','Java語言' ] slm.setStringList(self.qList)listView.setModel(slm )listView.clicked.connect(self.clicked) layout.addWidget( listView )self.setLayout(layout) def clicked(self, qModelIndex):QMessageBox.information(self, "QListView", "你選擇了: "+ self.qList[qModelIndex.row()])if __name__ == "__main__": app = QApplication(sys.argv)win = ListViewDemo() win.show() sys.exit(app.exec_())
3、QListWidet類
QListWidet類是一個(gè)基于條目的接口,用于從列表中添加或刪除條目。列表中的每個(gè)條目都是一個(gè)QListWidgetltem對(duì)象。QListWidget可以設(shè)置為多重選擇。
QListWidget類中的常用方法如下表所示:
QListWidget類中的常用信號(hào)如下表所示:
通過示例了解QListWidget類的使用方法,效果如下所示:
示例中,?將QListWidget控件的itemClicked信號(hào)與自定義對(duì)象的Clicked()槽函數(shù)進(jìn)行綁定,當(dāng)單擊QListWidget列表中的一個(gè)條目時(shí)會(huì)彈出消息框,提示選擇的是哪個(gè)條目。
實(shí)現(xiàn)代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class ListWidget(QListWidget):def clicked(self,item):QMessageBox.information(self, "ListWidget", "你選擇了: "+item.text())if __name__ == '__main__':app = QApplication(sys.argv)listWidget = ListWidget()listWidget.resize(300,120) listWidget.addItem("Pyhon語言");listWidget.addItem("C語言");listWidget.addItem("C++語言");listWidget.addItem("Java語言");listWidget.setWindowTitle('QListwidget 例子')listWidget.itemClicked.connect(listWidget.clicked)listWidget.show() sys.exit(app.exec_())
4、QTableWidget類
QTableWidget是Qt程序中常用的顯示數(shù)據(jù)表格的空間,類似于C#中的DataGrid。QTableWidget是QTableView的子類,它使用標(biāo)準(zhǔn)的數(shù)據(jù)模型,并且其單元格數(shù)據(jù)是通過QTableWidgetltem 對(duì)象來實(shí)現(xiàn)的。使用QTableWidget時(shí)就需要QTableWidgetltem,用來表示表格中的一個(gè)單元格,整個(gè)表格就是用各單元格構(gòu)建起來的。
QTableWidget類中的常用方法如下表所示:
編輯規(guī)則的枚舉值類型如下表所示:
表格的選擇行為的枚舉值類型如下表所示:
單元格文本的水平對(duì)齊方式如下表所示:
單元格文本的垂直對(duì)齊方式如下表所示:
如果要設(shè)置水平和垂直對(duì)齊方式,比如在表格空間內(nèi)上、下、左、右居中對(duì)齊,那么只要使用Qt.AlignHCenter和Qt.AlignVCenter 即可。
通過示例了解QTableWidget類的使用方法,效果如下所示:
示例中,?構(gòu)造了一個(gè)QTableWidget對(duì)象,并且設(shè)置表格為4行3列。生成了一個(gè)QTableWidgetltem對(duì)象,名稱為“不脫發(fā)的程序猿”。
實(shí)現(xiàn)代碼如下所示:
import sys
from PyQt5.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QApplication, QTableWidgetItem, QAbstractItemView )class Table(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("QTableWidget 例子")self.resize(430,230);conLayout = QHBoxLayout()tableWidget = QTableWidget()tableWidget.setRowCount(4)tableWidget.setColumnCount(3)conLayout.addWidget(tableWidget )tableWidget.setHorizontalHeaderLabels(['姓名','性別','體重(kg)']) newItem = QTableWidgetItem("不脫發(fā)的程序猿") tableWidget.setItem(0, 0, newItem) newItem = QTableWidgetItem("男") tableWidget.setItem(0, 1, newItem) newItem = QTableWidgetItem("65") tableWidget.setItem(0, 2, newItem) # 將表格變?yōu)榻咕庉?tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)# 設(shè)置表格為整行選擇#tableWidget.setSelectionBehavior( QAbstractItemView.SelectRows)# 將行和列的大小設(shè)為與內(nèi)容相匹配#tableWidget.resizeColumnsToContents()#tableWidget.resizeRowsToContents()#表格表頭的顯示與隱藏#tableWidget.verticalHeader().setVisible(False)#tableWidget.horizontalHeader().setVisible(False)# 不顯示表格單元格的分割線#tableWidget.setShowGrid(False)# 不顯示垂直表頭tableWidget.verticalHeader().setVisible(False)self.setLayout(conLayout)if __name__ == '__main__':app = QApplication(sys.argv)example = Table() example.show() sys.exit(app.exec_())
5、QTreeWidget和QTreeWidgetltem類
QTreeWidget類實(shí)現(xiàn)了樹形結(jié)構(gòu),效果如下圖所示:
QTreeWidget類中的常用方法如下表所示:
QTreeWidgetltem類中的常用方法如下表所示:
通過示例了解QTreeWidget和QTreeWidgetltem類的使用方法,效果如下所示:
示例中,實(shí)現(xiàn)樹形結(jié)構(gòu)節(jié)點(diǎn)的添加、修改和刪除,?實(shí)現(xiàn)代碼如下所示:
import sys
from PyQt5.QtWidgets import *
#from PyQt5.QtGui import QIcon , QBrush , QColor
#from PyQt5.QtCore import Qt class TreeWidgetDemo(QWidget): def __init__(self,parent=None):super(TreeWidgetDemo,self).__init__(parent)self.setWindowTitle('TreeWidget 例子')operatorLayout = QHBoxLayout()addBtn = QPushButton("添加節(jié)點(diǎn)")updateBtn = QPushButton("修改節(jié)點(diǎn)")delBtn = QPushButton("刪除節(jié)點(diǎn)") operatorLayout.addWidget(addBtn)operatorLayout.addWidget(updateBtn)operatorLayout.addWidget(delBtn)# 按鈕的信號(hào)槽連接addBtn.clicked.connect(self.addTreeNodeBtn )updateBtn.clicked.connect(self.updateTreeNodeBtn )delBtn.clicked.connect(self.delTreeNodeBtn ) self.tree = QTreeWidget(self)# 設(shè)置列數(shù)self.tree.setColumnCount(2)# 設(shè)置頭的標(biāo)題self.tree.setHeaderLabels(['Key','Value'])root= QTreeWidgetItem(self.tree)root.setText(0,'root')root.setText(1,'0')child1 = QTreeWidgetItem(root)child1.setText(0,'child1')child1.setText(1,'1')child2 = QTreeWidgetItem(root)child2.setText(0,'child2')child2.setText(1,'2')child3 = QTreeWidgetItem(root)child3.setText(0,'child3')child3.setText(1,'3') child4 = QTreeWidgetItem(child3)child4.setText(0,'child4')child4.setText(1,'4')child5 = QTreeWidgetItem(child3)child5.setText(0,'child5')child5.setText(1,'5')self.tree.addTopLevelItem(root)self.tree.clicked.connect( self.onTreeClicked )mainLayout = QVBoxLayout(self);mainLayout.addLayout(operatorLayout);mainLayout.addWidget(self.tree); self.setLayout(mainLayout) def onTreeClicked(self, qmodelindex):item = self.tree.currentItem()print("key=%s ,value=%s" % (item.text(0), item.text(1)))def addTreeNodeBtn(self):print('--- addTreeNodeBtn ---')item = self.tree.currentItem()node = QTreeWidgetItem(item)node.setText(0,'newNode')node.setText(1,'10') def updateTreeNodeBtn(self):print('--- updateTreeNodeBtn ---')item = self.tree.currentItem()item.setText(0,'updateNode')item.setText(1,'20') def delTreeNodeBtn(self):print('--- delTreeNodeBtn ---')item = self.tree.currentItem()root = self.tree.invisibleRootItem()for item in self.tree.selectedItems():(item.parent() or root).removeChild(item)if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())
總結(jié)
以上是生活随笔為你收集整理的Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QPri
- 下一篇: Python Qt GUI设计:QTab