表格與樹解決的問題是如何在一個控件中有規(guī)律地呈現(xiàn)更多的數(shù)據(jù)。PyQt提供了兩種控件類用于解決該問題序调,其中一種是表格結(jié)構(gòu)的控件類发绢,另一種是樹形結(jié)構(gòu)的控件類坯认。
1荆隘、QTableView類
在通常情況下,一個應(yīng)用需要和一批數(shù)據(jù)(比如數(shù)組浇雹、列表)進(jìn)行交互柱徙,然后以表格的形式輸出這些信息缓屠,這時就要用到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對象來實(shí)現(xiàn)的。通常使用QTableWidget就能夠滿足我們的要求长赞。
QTableView控件可以綁定一個模型數(shù)據(jù)用來更新控件上的內(nèi)容晦攒,可用的模式如下表所示:
通過示例了解QTableView類的使用方法,效果如下所示:
實(shí)現(xiàn)代碼如下所示:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class 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是一個升級版本的QListView饱亮,它已經(jīng)建立了一個數(shù)據(jù)存儲模(QListWidgetltem)矾芙,直接調(diào)用addltem()函數(shù),就可以添加條目(ltem)近上。
QListView類中的常用方法如下表所示:
QListView類中的常用信號如下表所示:
通過示例了解QListView類的使用方法剔宪,效果如下所示:
示例中,將QListView控件的clicked信號與自定義對象的clicked()槽函數(shù)進(jìn)行綁定壹无,當(dāng)單擊QListView控件里Model中的一項時會彈出消息框(提示選擇的是哪─項)歼跟。
實(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類是一個基于條目的接口格遭,用于從列表中添加或刪除條目哈街。列表中的每個條目都是一個QListWidgetltem對象。QListWidget可以設(shè)置為多重選擇拒迅。
QListWidget類中的常用方法如下表所示:
QListWidget類中的常用信號如下表所示:
通過示例了解QListWidget類的使用方法骚秦,效果如下所示:
示例中, 將QListWidget控件的itemClicked信號與自定義對象的Clicked()槽函數(shù)進(jìn)行綁定璧微,當(dāng)單擊QListWidget列表中的一個條目時會彈出消息框作箍,提示選擇的是哪個條目。
實(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 對象來實(shí)現(xiàn)的跃巡。使用QTableWidget時就需要QTableWidgetltem,用來表示表格中的一個單元格牧愁,整個表格就是用各單元格構(gòu)建起來的素邪。
QTableWidget類中的常用方法如下表所示:
編輯規(guī)則的枚舉值類型如下表所示:
表格的選擇行為的枚舉值類型如下表所示:
單元格文本的水平對齊方式如下表所示:
單元格文本的垂直對齊方式如下表所示:
如果要設(shè)置水平和垂直對齊方式,比如在表格空間內(nèi)上猪半、下兔朦、左、右居中對齊磨确,那么只要使用Qt.AlignHCenter和Qt.AlignVCenter 即可沽甥。
通過示例了解QTableWidget類的使用方法,效果如下所示:
示例中乏奥, 構(gòu)造了一個QTableWidget對象摆舟,并且設(shè)置表格為4行3列。生成了一個QTableWidgetltem對象英融,名稱為“不脫發(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)榻咕庉?/i>
#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)
# 按鈕的信號槽連接
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_())