目錄
1、Table Widget
1.QTableWidget不能在mainwindow中隨主窗口的大小變化?
2.將表格變為禁止編輯:
3.設置表格為整行選擇
4.單個選中和多個選中的設置:
5.表格表頭的顯示與隱藏
6.對表頭文字的字體、顏色進行設置
7.在單元格里加入控件:
8.單元格中添加圖片:
9設置單元格字體顏色、背景顏色和字體字符:
10.設置單元格內文字的對齊方式
11.合并單元格:
12.設置單元格的大小
13.獲得單擊單元格的內容
14.QTableWidget要調整表格行寬主要涉及以下函數
15.添加表頭內容:
2、Table View
可用的模式有以下幾個
3、Table View與Widget的區別
在PyQt5上基于純代碼創建的表格TableWidget:
PyQt5中有兩種創建表格的控件:Table View和Table Widget。
1、Table Widget
QTableWidget是QT程序中常用的顯示數據表格的空間,很類似于VC、C#中的DataGrid。
pyqt5的tablewidget組件比較特殊,每個方格可以裝載其他組件來搭配實現不同的效果,所以在qtdesigner上找不到可視化直接設置mask或者其他可以限制填入單元格的設置。
self.MyTable = QTableWidget(4,3) #創建表格
self.MyTable.setHorizontalHeaderLabels([‘姓名’,’身高’,’體重’]) #設置表頭
參考資料:
[1] pyqt中tablewidget的使用 https://blog.csdn.net/yafwang/article/details/52754217
[2] 朝聞道 的《QTableWidget的用法總結》 https://www.cnblogs.com/findumars/p/5553367.html
[3] pyqt5 tablewidget 單元格設置正則表達式 https://blog.csdn.net/qq965194745/article/details/78910469
[4] Pyqt5系列(十)-QtWidget的使用 https://blog.csdn.net/zhulove86/article/details/52599738
1.QTableWidget不能在mainwindow中隨主窗口的大小變化?
解決:在表格外部添加布局。
代碼:tableWidget = new QTableWidget;
2.將表格變為禁止編輯:
tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
3.設置表格為整行選擇
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式
4.單個選中和多個選中的設置:
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //設置為可以選中多個目標
QAbstractItemView.ExtendedSelection/QAbstractItemView.ContiguousSelection 的區別不明顯,主要功能是正常情況下是單選,但按下Ctrl或Shift鍵后,可以多選)
5.表格表頭的顯示與隱藏
對于水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:
tableWidget.verticalHeader().setVisible(false); //隱藏列表頭
tableWidget.horizontalHeader().setVisible(false); //隱藏行表頭
6.對表頭文字的字體、顏色進行設置
QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //獲得水平方向表頭的Item對象
columnHeaderItem0->setFont(QFont(“Helvetica”)); //設置字體
columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //設置單元格背景顏色
columnHeaderItem0->setTextColor(QColor(200,111,30)); //設置文字顏色
7.在單元格里加入控件:
QComboBox *comBox = new QComboBox();
comBox->addItem(“Y”);
comBox->addItem(“N”);
tableWidget->setCellWidget(0,2,comBox);
8.單元格中添加圖片:
tableWidget->setItem(row, 0, new QTableWidgetItem(QIcon(“:/new/images/kingdemo.ico”),tr(“”)));
9設置單元格字體顏色、背景顏色和字體字符:
QTableWidgetItem *item = new QTableWidgetItem(“Apple”);
item->setBackgroundColor(QColor(0,60,10));
item->setTextColor(QColor(200,111,100));
item->setFont(QFont(“Helvetica”));
tableWidget->setItem(0,3,item);
另:如果需要對所有的單元格都使用這種字體,則可以使用 tableWidget->setFont(QFont(“Helvetica”));
10.設置單元格內文字的對齊方式
水平對齊方式有:
Constant Value Description
Qt.AlignLeft 0x0001 Aligns with the left edge.
Qt.AlignRight 0x0002 Aligns with the right edge.
Qt.AlignHCenter 0x0004 Centers horizontally in the available space.
Qt.AlignJustify 0x0008 Justifies the text in the available space.
垂直對齊方式:
Constant Value Description
Qt.AlignTop 0x0020 Aligns with the top.
Qt.AlignBottom 0x0040 Aligns with the bottom.
Qt.AlignVCenter 0x0080 Centers vertically in the available space.
如果兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式即可
11.合并單元格:
tableWidget->setSpan(0, 0, 3, 1) # 其參數為: 要改變單元格的1行數、2列數,要合并的3行數、4列數
12.設置單元格的大小
首先,可以指定某個行或者列的大小
tableWidget->setColumnWidth(3,200);
tableWidget->setRowHeight(3,60);
還可以將行和列的大小設為與內容相匹配
tableWidget->resizeColumnsToContents();
tableWidget->resizeRowsToContents();
13.獲得單擊單元格的內容
通過實現 itemClicked (QTableWidgetItem *) 信號的槽函數,就可以獲得鼠標單擊到的單元格指針,進而獲得其中的文字信息
connect(tableWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(getItem(QTreeWidgetItem*,int)));
//將itemClicked信號與函數getItem綁定
14.QTableWidget要調整表格行寬主要涉及以下函數
tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch);//使列完全填充并平分
tableWidget->verticalHeader()->setResizeMode(QHeaderView::Stretch);//行自適應寬度
tableWidget->resizeColumnsToContents(); //根據內容調整列寬
tableWidget->resizeColumnToContents(int col);//根據內容自動調整給定列寬
tableWidget->horizontalHeader()->setResizeMode//把給定列設置為給定模式
主要模式有Stretch和Fixed
15.添加表頭內容:
方法一:
QStringList header;
header<<”“<
2、Table View
qtableview這個控件可以綁定一個模型數據用來更新控件上的內容
可用的模式有以下幾個
// QStringListModel 存儲一組字符串
// QStandardItemModel 存儲任意層次結構的數據
// QDirModel 對文件系統進行封裝
// QSqlQueryModel 對SQL的查詢結果集進行封裝
// QSqlTableModel 對SQL中的table進行封裝
// QSqlRelationalTableModel 對帶有foreign key的SQL table進行封裝
// QSortFilterProxyModel 對另一個model執行sort and/or filter
可參考資料:https://www.zhaokeli.com/article/7986.html
3、Table View與Widget的區別
QTableWidget是QTableView的子類,主要區別是QTableView可以使用自定義的數據模型來顯示內容(也就是先要通過setModel來綁定數據源),而QTableWidget則只能使用標準的數據模型,并且其單元格數據是QTableWidgetItem的對象來實現的(也就是不需要數據源,將逐個單元格內的信息填好即可)。這主要體現在QTableView類中有setModel成員函數,而到了QTableWidget類中,該成員函數變成了私有。使用QTableWidget就離不開QTableWidgetItem。QTableWidgetItem用來表示表格中的一個單元格,正個表格都需要用逐個單元格構建起來。
QTableWidget:只能使用標準模式;
QTableView:可以使用自定義模式。
在PyQt5上基于純代碼創建的表格TableWidget:
下面代碼有部分函數有問題,主要是PyQt4與PyQt5的屬性和方法差異導致。
#-*-coding:utf-8-*-from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import time#基于Table Widget控件的表格
class MyTable(QTableWidget):def __init__(self,parent=None):super(MyTable,self).__init__(parent)self.setWindowTitle("第一個表格創建實驗")self.setWindowIcon(QIcon("a1.png"))self.resize(800,500) #設置表格尺寸#===1:創建初始表格self.setColumnCount(5)self.setRowCount(5)#self.setShowGrid(False) #是否需要顯示網格self.settableHeader()self.inputcelldata()self.settableSelectMode()#self.settableHeaderFontColor()#self.setCellFontColor()# self.setCellAlign()# self.setCellFontSize()# self.setCellFontColor()#self.setCellSpan()self.addRowColumn()# layout = QHBoxLayout()# layout.addWidget(MyTable)# self.setLayout(layout)#===1:設置表格單元格尺寸def settableSize(self):"""首先,可以指定某個行或者列的大小self.MyTable.setColumnWidth(2,50) #將第2列的單元格,設置成50寬度self.MyTable.setRowHeight(2,60) #將第2行的單元格,設置成60的高度還可以將行和列的大小設為與內容相匹配self.MyTable.resizeColumnsToContents() #將列調整到跟內容大小相匹配self.MyTable.resizeRowsToContents() #將行大小調整到跟內容的大學相匹配:return:"""self.setColumnWidth(0,50)self.setColumnWidth(3, 50)#self.setRowHeight(0,500)#1.2 設置表格的行和列的大小與輸入內容相匹配self.resizeColumnsToContents()self.resizeRowsToContents()#===2:設置表格的表頭名稱def settableHeader(self):#columnname = ['A','B','C','D','E']columnname = ['姓名', '性別', '年齡', '身高', '照片']#rowname = ['a','b','c','d','e']self.setHorizontalHeaderLabels(columnname)#self.setVerticalHeaderLabels(rowname)#===3:給表格輸入初始化數據def settableInitData(self):for i in range(5):for j in range(5):#1)直接在表格中添加數據self.setItem(i,j,QTableWidgetItem(str(i)+str(j)))#2)在表格的單元格中加入控件comBox = QComboBox()comBox.addItem("男")comBox.addItem("女")self.setCellWidget(i,j,comBox)def inputcelldata(self): #輸入數據self.setItem(0,0,QTableWidgetItem("張三"))#self.setItem(0,1,"男")comBox = QComboBox()comBox.addItem("男")comBox.addItem("女")self.setCellWidget(0, 1, comBox)self.setItem(0,2,QTableWidgetItem(str(25)))self.setItem(0,3,QTableWidgetItem(str(160.85)))"""在單元格里加入控件QComboBox"""def addwidgettocell(self):comBox = QComboBox()comBox.addItem("男")comBox.addItem("女")self.setCellWidget(0, 1, comBox)#===4:表格的其他相關屬性設置"""設置表格是否可編輯"""def settableEditTrigger(self):"""使用格式說明:在默認情況下,表格里的字符是可以更改的,比如雙擊一個單元格,就可以修改原來的內容,如果想禁止用戶的這種操作,讓這個表格對用戶只讀,可以這樣:QAbstractItemView.NoEditTriggers和QAbstractItemView.EditTrigger枚舉中的一個,都是觸發修改單元格內容的條件:QAbstractItemView.NoEditTriggers 0 No editing possible. 不能對表格內容進行修改QAbstractItemView.CurrentChanged 1 Editing start whenever current item changes.任何時候都能對單元格修改QAbstractItemView.DoubleClicked 2 Editing starts when an item is double clicked.雙擊單元格QAbstractItemView.SelectedClicked 4 Editing starts when clicking on an already selected item.單擊已選中的內容QAbstractItemView.EditKeyPressed 8 Editing starts when the platform edit key has been pressed over an item.QAbstractItemView.AnyKeyPressed 16 Editing starts when any key is pressed over an item.按下任意鍵就能修改QAbstractItemView.AllEditTriggers 31 Editing starts for all above actions.以上條件全包括"""self.setEditTriggers(QAbstractItemView.NoEditTriggers)"""設置表格為整行選擇"""def settableSelect(self):"""QAbstractItemView.SelectionBehavior枚舉還有如下類型Constant Value DescriptionQAbstractItemView.SelectItems 0 Selecting single items.選中單個單元格QAbstractItemView.SelectRows 1 Selecting only rows.選中一行QAbstractItemView.SelectColumns 2 Selecting only columns.選中一列"""self.setSelectionBehavior(QAbstractItemView.SelectRows)"""單個選中和多個選中的設置"""def settableSelectMode(self):"""setSelectionMode(QAbstractItemView.ExtendedSelection) #設置為可以選中多個目標該函數的參數還可以是:QAbstractItemView.NoSelection 不能選擇QAbstractItemView.SingleSelection 選中單個目標QAbstractItemView.MultiSelection 選中多個目標QAbstractItemView.ExtendedSelection和ContiguousSelection的區別不明顯,要功能是正常情況下是單選,但按下Ctrl或Shift鍵后,可以多選:return:"""self.setSelectionMode(QAbstractItemView.ExtendedSelection)"""表頭顯示與隱藏"""def settableHeaderVisible(self):"""對于水平或垂直方法的表頭,可以用以下方式進行 隱藏/顯示 的設置:self.MyTable.verticalHeader().setVisible(False)self.MyTable.horizontalHeader().setVisible(False)"""# 4.3 隱藏表頭self.verticalHeader().setVisible(False)self.horizontalHeader().setVisible(False)"""對表頭文字的字體、顏色進行設置"""def settableHeaderFontColor(self):"""PyQt5中沒有如下設置背景顏色和字體顏色函數headItem.setBackgroundColor(QColor(c)) # 設置單元格背景顏色headItem.setTextColor(QColor(200, 111, 30)) # 設置文字顏色:return:有(設置字體顏色):headItem.setForeground(QBrush(Qt.red))headItem.setForeground(QBrush(QColor(128,255,0)))"""f, ok = QFontDialog.getFont()for x in range(self.columnCount()):headItem = self.horizontalHeaderItem(x) # 獲得水平方向表頭的Item對象#headItem.setFont(QFont("song",12,QFont.Bold))if ok:headItem.setFont(f) # 設置字體#設置表頭字體顏色#headItem.setForeground(QBrush(Qt.red))headItem.setForeground(QBrush(QColor(128,255,0)))headItem.setTextAlignment(Qt.AlignLeft)def settableproperty(self):# 4.2 選中表格中的某一行self.setSelectionBehavior(QAbstractItemView.SelectRows)"""動態插入行列 """def addRowColumn(self):"""當初始的行數或者列數不能滿足需要的時候,我們需要動態的調整表格的大小,如入動態的插入行:insertColumn()動態插入列。insertRow(int)、insertColumn(int),指定位置插入行或者列"""rowcount = self.rowCount()self.insertRow(rowcount)"""動態移除行列 """def removeRowColumn(self):"""removeColumn(int column) 移除column列及其內容。removeRow(int row)移除第row行及其內容。:return:"""rowcount = self.rowCount()self.removeRow(rowcount-1)#=========第2部分:對單元格的進行設置============="""1.單元格設置字體顏色和背景顏色""""""2.設置單元格中的字體和字符大小""""""3.設置單元格內文字的對齊方式:""""""4.合并單元格效果的實現:""""""5.設置單元格的大小(見settableSize()函數)""""""6 單元格Flag的實現"""def setCellFontColor(self):newItem = self.item(0,1)newItem.setBackground(Qt.red)#newItem.setBackground(QColor(0, 250, 10))#newItem.(QColor(200, 111, 100))def setCellFontSize(self):"""首先,先生成一個字體QFont對象,并將其字體設為宋體,大小設為12,并且加粗再利用單元格的QTableWidgetItem類中的setFont加載給特定的單元格。如果需要對所有的單元格都使用這種字體,則可以使用self.MyTable.setFont(testFont)#利用QTableWidget類中的setFont成員函數,將所有的單元格都設成該字體:return:"""textFont = QFont("song", 12, QFont.Bold)newItem = QTableWidgetItem("張三")# newItem.setBackgroundColor(QColor(0,60,10))# newItem.setTextColor(QColor(200,111,100))newItem.setFont(textFont)self.setItem(0, 0, newItem)def setCellAlign(self):"""這個比較簡單,使用newItem.setTextAlignment()函數即可,該函數的參數為單元格內的對齊方式,和字符輸入順序是自左相右還是自右向左。水平對齊方式有:Constant Value DescriptionQt.AlignLeft 0x0001 Aligns with the left edge.Qt.AlignRight 0x0002 Aligns with the right edge.Qt.AlignHCenter 0x0004 Centers horizontally in the available space.Qt.AlignJustify 0x0008 Justifies the text in the available space.垂直對齊方式:Constant Value DescriptionQt.AlignTop 0x0020 Aligns with the top.Qt.AlignBottom 0x0040 Aligns with the bottom.Qt.AlignVCenter 0x0080 Centers vertically in the available space.如果兩種都要設置,只要用 Qt.AlignHCenter | Qt.AlignVCenter 的方式即可:return:"""newItem = QTableWidgetItem("張三")newItem.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)self.setItem(0, 0, newItem)def setCellSpan(self):"""self.MyTable.setSpan(0, 0, 3, 1)# 其參數為: 要改變單元格的 1行數 2列數要合并的 3行數 4列數:return:"""self.setSpan(0,0,3,1)def update_item_data(self, data):"""更新內容"""self.setItem(0, 0, QTableWidgetItem(data)) # 設置表格內容(行, 列) 文字class UpdateData(QThread):"""更新數據類"""update_date=pyqtSignal(str)def run(self):cnt=0while True:cnt+=1self.update_date.emit(str(cnt))time.sleep(1)if __name__ == '__main__':# 實例化表格app = QApplication(sys.argv)myTable = MyTable()# 啟動更新線程#update_data_thread = UpdateData()# update_data_thread.update_date.connect(myTable.update_item_data) # 鏈接信號# update_data_thread.start()# 顯示在屏幕中央# desktop = QApplication.desktop() # 獲取坐標# x = (desktop.width() - myTable.width()) // 2# y = (desktop.height() - myTable.height()) // 2# myTable.move(x, y) # 移動# 顯示表格myTable.show()app.exit(app.exec_())
?