PyQt5-高級控件使用(QTableWidget)


QTableWidget是Qt中常用顯示數據的表格,類似其他語言中的DataGrid; QTableWidget是QtableView的子類;每個單元格下是一個QTableWidgetItem對象;

常用方法如下:

表格編輯類型的枚舉常量:

單元格選中相關枚舉類型:

單元格內容對齊方式枚舉類型:

例如:

 1 #QTableWidget 控件使用
 2 from PyQt5.QtWidgets import  QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar,  QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout,   QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor
 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
 5 import sys
 6 
 7 class WindowClass(QWidget):
 8 
 9     def __init__(self,parent=None):
10 
11         super(WindowClass, self).__init__(parent)
12         self.layout=QHBoxLayout()
13         self.resize(400,300)
14         tableWidget=QTableWidget()
15         tableWidget.setRowCount(4)#行數
16         tableWidget.setColumnCount(4)#列數
17         tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面
18         tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)  # 設置只能選中一行
19         tableWidget.setEditTriggers(QTableView.NoEditTriggers)  # 不可編輯
20         tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows);  # 設置只有行選中
21         
22         self.layout.addWidget(tableWidget)
23         tableWidget.setHorizontalHeaderLabels(['姓名','地址','年齡','工資']) #橫向標題排列,如果使用setVerticalHeaderLabels則是縱向排列標題
24         items=[['JONES','Beijing','23',2300],['SMITH','SHAngHai','23','3000'],['ZY','Tianjin','23','2000'],['Smith','SJT','22','1030']]
25         for i in range(len(items)):#注意上面列表中數字加單引號,否則下面不顯示(或者下面str方法轉化一下即可)
26             item=items[i]
27             for j in range(len(item)):
28                  item = QTableWidgetItem(str(items[i][j]))
29                  tableWidget.setItem(i,j,item)
30         self.setLayout(self.layout)
31 
32 if __name__=="__main__":
33     app=QApplication(sys.argv)
34     win=WindowClass()
35     win.show()
36     sys.exit(app.exec_())

 

以上部分方法是之間使用QTableView組件時使用過的;請注意;

其他設置:

1 tableWidget.horizontalHeader().setVisible(False)#設置列標題隱藏(針對列標題橫向排列)
2  #tableWidget.verticalHeader().setVisible(False)#設置列標題隱藏(針對列標題縱向排列)

修改上面程序,項單元格中添加控件:

 1 #QTableWidget 控件使用
 2 from PyQt5.QtWidgets import  QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar,  QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout,   QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor
 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
 5 
 6 import sys
 7 
 8 
 9 class WindowClass(QWidget):
10 
11     def __init__(self,parent=None):
12 
13         super(WindowClass, self).__init__(parent)
14         self.layout=QHBoxLayout()
15         self.resize(400,300)
16         tableWidget=QTableWidget()
17         tableWidget.setRowCount(4)#行數
18         tableWidget.setColumnCount(4)#列數
19         tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面
20         tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)  # 設置只能選中一行
21         tableWidget.setEditTriggers(QTableView.NoEditTriggers)  # 不可編輯
22         tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows);  # 設置只有行選中, 整行選中
23         tableWidget.resizeColumnsToContents()#設置列寬高按照內容自適應
24         tableWidget.resizeRowsToContents()#設置行寬和高按照內容自適應
25         #tableWidget.horizontalHeader().setVisible(False)#設置列標題隱藏(針對列標題橫向排列)
26         #tableWidget.verticalHeader().setVisible(False)#設置列標題隱藏(針對列標題縱向排列)
27         self.layout.addWidget(tableWidget)
28         tableWidget.setHorizontalHeaderLabels(['姓名','地址','年齡','操作']) #橫向標題排列,如果使用setVerticalHeaderLabels則是縱向排列標題
29         items=[['JONES','Beijing','23',''],['SMITH','SHAngHai','23',''],['ZY','Tianjin','23',''],['Smith','SJT','22','']]
30         for i in range(len(items)):#注意上面列表中數字加單引號,否則下面不顯示(或者下面str方法轉化一下即可)
31             item=items[i]
32 
33             for j in range(len(item)):
34 #-----------------------------修改后程序,最后一列添加按鈕-------------------#
35                  if  j!=3:
36                      item = QTableWidgetItem(str(items[i][j]))
37                      tableWidget.setItem(i, j, item)
38                  else: #最后一列添加控件
39                      btn = QPushButton("刪除")
40                      btn.setDown(True)
41                      btn.setStyleSheet("QPushButton{margin:3px};")
42                      tableWidget.setCellWidget(i, j, btn)
43 #--------------------------------------------------------------------------#
44 
45 #------------------------------0,1位置添加下拉列表框----------------------#
46         #某個單元格設置為控件
47         comBox=QComboBox()
48         comBox.addItem("北京")
49         comBox.addItems(["上海","天津"])
50         comBox.setStyleSheet("QComboBox{margin:3px};")
51         tableWidget.setCellWidget(0,1,comBox)
52 #------------------------------------------------------------------------#
53         #字體設置
54         newItem=tableWidget.item(0,0)
55         newItem.setFont(QFont("Times",12,QFont.Black))#字體樣式加粗
56         newItem.setForeground(QBrush(QColor(255,0,0)))#字體顏色
57         #設置排序
58         tableWidget.sortItems(1,Qt.AscendingOrder)#Qt.DescendingOrder 升序降序
59         item_00=tableWidget.item(0,0)
60         item_00.setTextAlignment(Qt.AlignRight)#Qt.AlignCenter ...
61         #合並單元格
62         tableWidget.setSpan(0,0,3,1)
63         #單元格寬高設置
64         tableWidget.setColumnWidth(0,150)#第一個參數為行下標
65         tableWidget.setRowHeight(0,40)
66         #設置不顯示分割線
67         tableWidget.setShowGrid(False)
68 
69         #單元格設置圖片
70         tableWidget.setItem(1,1,QTableWidgetItem(QIcon("./image/add.ico"),"百度"))
71 
72         tableWidget.setItem(0,0,newItem)
73 
74         self.setLayout(self.layout)
75 
76 if __name__=="__main__":
77     app=QApplication(sys.argv)
78     win=WindowClass()
79     win.show()
80     sys.exit(app.exec_())


設置單元格圖片:

 1 #QTableWidget 控件使用
 2 from PyQt5.QtWidgets import  QComboBox,QTableView,QAbstractItemView,QHeaderView,QTableWidget, QTableWidgetItem, QMessageBox,QListWidget,QListWidgetItem, QStatusBar,  QMenuBar,QMenu,QAction,QLineEdit,QStyle,QFormLayout,   QVBoxLayout,QWidget,QApplication ,QHBoxLayout, QPushButton,QMainWindow,QGridLayout,QLabel
 3 from PyQt5.QtGui import QIcon,QPixmap,QStandardItem,QStandardItemModel,QCursor,QFont,QBrush,QColor
 4 from PyQt5.QtCore import QStringListModel,QAbstractListModel,QModelIndex,QSize,Qt
 5 
 6 import sys
 7 class WindowClass(QWidget):
 8 
 9     def __init__(self,parent=None):
10 
11         super(WindowClass, self).__init__(parent)
12         self.layout=QHBoxLayout()
13         self.resize(400,300)
14         tableWidget=QTableWidget()
15         tableWidget.setRowCount(10)#行數
16         tableWidget.setColumnCount(10)#列數
17         tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#所有列自動拉伸,充滿界面
18         tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)  # 設置只能選中一行
19         tableWidget.setEditTriggers(QTableView.NoEditTriggers)  # 不可編輯
20         tableWidget.setSelectionBehavior(QAbstractItemView.SelectItems);  # 設置只能選中單元格
21         tableWidget.resizeColumnsToContents()#設置列寬高按照內容自適應
22         tableWidget.resizeRowsToContents()#設置行寬和高按照內容自適應
23         #tableWidget.setHorizontalHeaderLabels(['','','','','','','','','',''])
24 
25         for i in range(10):
26             tableWidget.setColumnWidth(i,20)
27         for i in range(10):
28             tableWidget.setRowHeight(i,20)
29         for k in range(10):
30             for m in range(10):
31                 item=QTableWidgetItem()
32                 item.setFlags(Qt.ItemIsEnabled)#點擊圖片選中單元格
33                 icon=QIcon('./image/7.ico')
34                 item.setIcon(icon)
35 
36                 tableWidget.setItem(k,m,item)
37         tableWidget.itemClicked.connect(self.getItemsText)
38         self.layout.addWidget(tableWidget)
39         self.setLayout(self.layout)
40     def getItemsText(self,item):
41         print("獲取內容:",item)#item.icon())
42 
43 if __name__=="__main__":
44     app=QApplication(sys.argv)
45     win=WindowClass()
46     win.show()
47     sys.exit(app.exec_())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM