天天看點

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

目錄

1、QTableView類

2、QListView類

3、QListWidet類

4、QTableWidget類

5、QTreeWidget和QTreeWidgetltem類

表格與樹解決的問題是如何在一個控件中有規律地呈現更多的資料。PyQt提供了兩種控件類用于解決該問題,其中一種是表格結構的控件類,另一種是樹形結構的控件類。

在通常情況下,一個應用需要和一批資料(比如數組、清單)進行互動,然後以表格的形式輸出這些資訊,這時就要用到QTableView類了。在QtableView中可以使用自定義的資料模型來顯示内容,通過setModel來綁定資料源。

QTableWidget繼承自QTableView,主要差別是QTableView可以使用自定義的資料模型來顯示内容(先要通過setModel來綁定資料源),而QTableWidget隻能使用标準的資料模型,并且其單元格資料是通過QTableWidgetltem對象來實作的。通常使用QTableWidget就能夠滿足我們的要求。

QTableView控件可以綁定一個模型資料用來更新控件上的内容,可用的模式如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)
通過示例了解QTableView類的使用方法,效果如下所示:
Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)
實作代碼如下所示:

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(['标題1','标題2','标題3','标題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_())      

QListView類用于展示資料,它的子類是QListWidget類。QListView是基于模型(Model)的,需要程式來建立模型,然後再儲存資料。

QListWidget是一個更新版本的QListView,它已經建立了一個資料存儲模(QListWidgetltem),直接調用addltem()函數,就可以添加條目(ltem)。

QListView類中的常用方法如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

QListView類中的常用信号如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

通過示例了解QListView類的使用方法,效果如下所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

示例中,将QListView控件的clicked信号與自定義對象的clicked()槽函數進行綁定,當單擊QListView控件裡Model中的一項時會彈出消息框(提示選擇的是哪─項)。

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_())      

QListWidet類是一個基于條目的接口,用于從清單中添加或删除條目。清單中的每個條目都是一個QListWidgetltem對象。QListWidget可以設定為多重選擇。

QListWidget類中的常用方法如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

QListWidget類中的常用信号如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

通過示例了解QListWidget類的使用方法,效果如下所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

示例中, 将QListWidget控件的itemClicked信号與自定義對象的Clicked()槽函數進行綁定,當單擊QListWidget清單中的一個條目時會彈出消息框,提示選擇的是哪個條目。

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_())      

QTableWidget是Qt程式中常用的顯示資料表格的空間,類似于C#中的DataGrid。QTableWidget是QTableView的子類,它使用标準的資料模型,并且其單元格資料是通過QTableWidgetltem 對象來實作的。使用QTableWidget時就需要QTableWidgetltem,用來表示表格中的一個單元格,整個表格就是用各單元格建構起來的。

QTableWidget類中的常用方法如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

編輯規則的枚舉值類型如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

表格的選擇行為的枚舉值類型如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

單元格文本的水準對齊方式如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

單元格文本的垂直對齊方式如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

如果要設定水準和垂直對齊方式,比如在表格空間内上、下、左、右居中對齊,那麼隻要使用Qt.AlignHCenter和Qt.AlignVCenter 即可。

通過示例了解QTableWidget類的使用方法,效果如下所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

示例中, 構造了一個QTableWidget對象,并且設定表格為4行3列。生成了一個QTableWidgetltem對象,名稱為“不脫發的程式猿”。

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("不脫發的程式猿")  
  tableWidget.setItem(0, 0, newItem)  
   
  newItem = QTableWidgetItem("男")  
  tableWidget.setItem(0, 1, newItem)  
   
  newItem = QTableWidgetItem("65")  
  tableWidget.setItem(0, 2, newItem)   
 
  # 将表格變為禁止編輯
  #tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
 
  # 設定表格為整行選擇
  #tableWidget.setSelectionBehavior( QAbstractItemView.SelectRows)
  # 将行和列的大小設為與内容相比對
  #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_())      

QTreeWidget類實作了樹形結構,效果如下圖所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

QTreeWidget類中的常用方法如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

QTreeWidgetltem類中的常用方法如下表所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

通過示例了解QTreeWidget和QTreeWidgetltem類的使用方法,效果如下所示:

Python Qt GUI設計:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和樹類(提升篇—1)

示例中,實作樹形結構節點的添加、修改和删除, 實作代碼如下所示:

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("添加節點")
  updateBtn =  QPushButton("修改節點")
  delBtn = QPushButton("删除節點")  
  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)
        # 設定列數
  self.tree.setColumnCount(2)
        # 設定頭的标題
  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_())