1. 程式人生 > >PyQt5-高階控制元件使用(QTableView)

PyQt5-高階控制元件使用(QTableView)

QTableView類用於以表格形式輸出資訊,可通過自定義的資料模型來顯示資料,通過setModel來繫結資料來源;

繼承結構如下:

 

QTableView有以下幾種模式:

例如:

 1 #QTableView元件的使用
 2 from PyQt5.QtWidgets import QTableView, QHeaderView, QFormLayout,   QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
 3 import sys
4 from PyQt5.QtCore import * 5 from PyQt5.QtGui import QStandardItemModel,QStandardItem 6 7 class WindowClass(QWidget): 8 #如果整合QMainWindow 則self.setLayout(self.layout) 替換成 9 """ 10 widget=QWidget() 11 widget.setLayout(self.layout) 12 self.setCentralWidget(widget)
13 """ 14 #即可, 注意整合QWidget和整合QMainWindow時候區別 15 16 def __init__(self,parent=None): 17 super(WindowClass, self).__init__(parent) 18 self.layout=QVBoxLayout() 19 self.model=QStandardItemModel(4,4)#儲存任意結構資料 20 self.model.setHorizontalHeaderLabels(['序號','姓名','
年齡','地址']) 21 for row in range(4): 22 for column in range(4): 23 i=QStandardItem("row %s,column %s"%(row,column)) 24 self.model.setItem(row,column,i) 25 self.tableView=QTableView() 26 self.tableView.setModel(self.model) 27 self.layout.addWidget(self.tableView) 28 29 #繼承QMainWidow使用下面三行程式碼 30 # widget=QWidget() 31 # widget.setLayout(self.layout) 32 # self.setCentralWidget(widget) 33 34 #繼承QWidget則使用下面這樣程式碼 35 self.setLayout(self.layout) 36 37 #設定表格充滿這個佈局QHeaderView 38 #self.tableView.horizontalHeader().setStretchLastSection(True)#最後一列決定充滿剩下的介面 39 self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿介面 40 41 42 if __name__=="__main__": 43 app=QApplication(sys.argv) 44 win=WindowClass() 45 win.show() 46 sys.exit(app.exec_())

 

對上面例項進行擴充,新增行,刪除行操作:

 1 #QTableView元件的使用
 2 from PyQt5.QtWidgets import  QAbstractItemView,QAction, QMenuBar,QTableView, QHeaderView, QFormLayout,   
QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
3 import sys 4 from PyQt5.QtCore import * 5 from PyQt5.QtGui import QStandardItemModel,QStandardItem 6 7 class WindowClass(QMainWindow): 8 #如果整合QMainWindow 則self.setLayout(self.layout) 替換成 9 """ 10 widget=QWidget() 11 widget.setLayout(self.layout) 12 self.setCentralWidget(widget) 13 """ 14 #即可, 注意整合QWidget和整合QMainWindow時候區別 15 16 def __init__(self,parent=None): 17 super(WindowClass, self).__init__(parent) 18 self.layout=QVBoxLayout() 19 self.model=QStandardItemModel(4,4)#儲存任意結構資料 20 self.model.setHorizontalHeaderLabels(['序號','姓名','年齡','地址']) 21 for row in range(4): 22 for column in range(4): 23 i=QStandardItem(" row %s,column %s"%(row,column)) 24 self.model.setItem(row,column,i) 25 self.tableView=QTableView() 26 self.tableView.setModel(self.model) 27 self.layout.addWidget(self.tableView) 28 29 #繼承QMainWidow使用下面三行程式碼 30 widget=QWidget() 31 widget.setLayout(self.layout) 32 self.setCentralWidget(widget) 33 34 #繼承QWidget則使用下面這樣程式碼 35 #self.setLayout(self.layout) 36 37 #設定表格充滿這個佈局QHeaderView 38 #self.tableView.horizontalHeader().setStretchLastSection(True)#最後一列決定充滿剩下的介面 39 self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿介面 40 41 #新增menu選單欄,注意:QMainWindow 才可以有選單欄,QWidget沒有,因此上面只能採用繼承QMainWIndow 42 tool = self.addToolBar("File") #這裡嘗試使用QmenuBar,則此時會卡死,無法完成下面appedRow操作(猜測:可能是因為本身不允許menuBar完成這種操作) 43 self.action= QAction("新增", self) 44 self.action2=QAction("刪除",self) 45 tool.addAction(self.action) 46 tool.addAction(self.action2) 47 tool.actionTriggered[QAction].connect(self.processtrigger) 48 49 self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)#設定只能選中一行 50 self.tableView.setEditTriggers(QTableView.NoEditTriggers)#不可編輯 51 self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows);#設定只有行選中 52 53 def processtrigger(self,action): 54 if action.text()=="新增": 55 self.model.appendRow([ 56 QStandardItem('row %s,column %s' % (11, 11)), 57 QStandardItem('row %s,column %s' % (11, 11)), 58 QStandardItem('row %s,column %s' % (11, 11)), 59 QStandardItem('row %s,column %s' % (11, 11)), 60 ]) 61 if action.text()=="刪除": 62 63 r= self.tableView.selectionModel().selectedRows()#獲取被選中行 64 print(r)#被選中行的列表,每個元素是ModelIndex物件 65 #indexs = self.tableView.selectionModel().selection().indexes()#返回結果是QModelIndex類物件,裡面有row和column方法獲取行列索引 66 #print(indexs[0].row()) 67 if r: 68 #下面刪除時,選中多行中的最後一行,會被刪掉;不選中,則預設第一行刪掉 69 index=self.tableView.currentIndex() 70 print(index.row()) 71 self.model.removeRow(index.row()) 72 73 74 if __name__=="__main__": 75 app=QApplication(sys.argv) 76 win=WindowClass() 77 win.show() 78 sys.exit(app.exec_())