目錄
一.顯示二維表資料
二.顯示列資料
三.擴展的串列控制元件
四.擴展的表格控制元件
五.在單元格中放置控制元件
六.在表格中搜索Cell和行定位
七.設定單元格字體和顏色
八.按表格的某一列排序
從本講開始學習復雜控制元件,加油!
一.顯示二維表資料
顯示二維表資料(QTableVi ew控制元件)
資料源 Model
需要創建QTableView實體和一個資料源(Model) ,然后將兩者關聯,這個體系類似于MVC模式,
一個QTableView實體可以存放不同的資料源,一個資料源也可以對應不同的QTableView實體,
MVC: Model Viewer Controller 即將資料Model和前端視圖Viewer分離,通過控制器Controller 來控制,
MVC的目的是將后端的資料和前端頁面的耦合度降低,
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class TableView(QWidget):
def __init__(self):
super(TableView, self).__init__()
self.setWindowTitle('QTableView表格視圖控制元件演示')
self.resize(500,300)
self.model=QStandardItemModel(4,3)#二維表4行3列
#資料表的欄位
self.model.setHorizontalHeaderLabels(['id','name','age'])
self.tableView=QTableView()
#關聯QTableView控制元件和Model
self.tableView.setModel(self.model)
#添加資料
item11=QStandardItem('1') #一個QStandardItem就是一個單元格
item12 = QStandardItem('Kobe')
item13 = QStandardItem('24')
self.model.setItem(0,0,item11)
self.model.setItem(0, 1, item12)
self.model.setItem(0, 2, item13)
#可跳行添加資料
item31 = QStandardItem('7')
item32 = QStandardItem('Durant')
item33 = QStandardItem('35')
self.model.setItem(2, 0, item31)
self.model.setItem(2, 1, item32)
self.model.setItem(2, 2, item33)
#垂直布局
layout=QVBoxLayout()
layout.addWidget(self.tableView)
self.setLayout(layout)
if __name__=='__main__':
app=QApplication(sys.argv)
main=TableView()
main.show()
sys.exit(app.exec_())
運行結果:

二.顯示列資料
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QStringListModel
class ListView(QWidget):
def __init__(self):
super(ListView, self).__init__()
self.setWindowTitle('ListView例子')
self.resize(300,270)
layout=QVBoxLayout()
listView=QListView()
#資料源
listModel=QStringListModel()
self.list=['串列項1','串列項2','串列項3']
listModel.setStringList(self.list)
#關聯視圖與資料源
listView.setModel(listModel)
listView.clicked.connect(self.clicked)
layout.addWidget(listView)
self.setLayout(layout)
def clicked(self,item):
QMessageBox.information(self,'QListView','您選擇了:'+self.list[item.row()])
if __name__=='__main__':
app=QApplication(sys.argv)
main=ListView()
main.show()
sys.exit(app.exec_())
運行結果:

三.擴展的串列控制元件
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QStringListModel
'''
QListWidget是QListView的子類
添加了很多API,支持MVC模式,也支持非MVC模式,即資料直接添加到控制元件上
'''
class ListWidget(QMainWindow):
def __init__(self):
super(ListWidget, self).__init__()
self.setWindowTitle('ListWidget例子')
self.resize(300,270)
#直接添加的方式適合少量的資料的時候
self.listWidget=QListWidget()
#self.listWidget.resize(300,120)
self.listWidget.addItem('item1')
self.listWidget.addItem('item2')
self.listWidget.addItem('item3')
self.listWidget.addItem('item4')
self.listWidget.addItem('item5')
self.listWidget.itemClicked.connect(self.clicked)
#設定中心控制元件之后,會鋪滿整個螢屏,無需再單獨設定listWidget尺寸
self.setCentralWidget(self.listWidget)
def clicked(self,index):
QMessageBox.information(self,'ListWidget','您選擇了:'+self.listWidget.item(self.listWidget.row(index)).text())
if __name__=='__main__':
app=QApplication(sys.argv)
main=ListWidget()
main.show()
sys.exit(app.exec_())
運行結果:

四.擴展的表格控制元件
每一個Cell (單元格) 是一個QTableWidgetItem
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
'''
QTableWidget是QTableView的子類
添加了很多API,支持MVC模式,也支持非MVC模式,即資料直接添加到控制元件上
'''
class TableWidget(QWidget):
def __init__(self):
super(TableWidget, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QTableWidget演示')
self.resize(430, 230)
layout = QHBoxLayout()
tablewidget = QTableWidget()
# 4行3列
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
tablewidget.setHorizontalHeaderLabels(['name','age','address'])
nameItem=QTableWidgetItem('小明')
tablewidget.setItem(0,0,nameItem)
ageItem = QTableWidgetItem('24')
tablewidget.setItem(0, 1, ageItem)
addressItem = QTableWidgetItem('北京')
tablewidget.setItem(0, 2, addressItem)
#禁止編輯
tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
#整行選擇
tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)
#調整列和行
tablewidget.resizeColumnsToContents()
tablewidget.resizeRowsToContents()
#隱藏表格頭
tablewidget.horizontalHeader().setVisible(False) #隱藏水平方向的表格頭
#tablewidget.verticalHeader().setVisible(False) #隱藏垂直方向的表格頭
#設定表格頭內容
tablewidget.setVerticalHeaderLabels(['a','b']) #垂直方向表格頭前兩個設為a,b
#隱藏表格線
tablewidget.setShowGrid(False)
layout.addWidget(tablewidget)
self.setLayout(layout)
if __name__=='__main__':
app=QApplication(sys.argv)
main=TableWidget()
main.show()
sys.exit(app.exec_())
運行結果:

五.在單元格中放置控制元件
在單元格中放置控制元件
setItem:將文本放到單元格中
setCellWidget:將控制元件放到單元格中
setStyleSheet設定控制元件的樣式(QSS)
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
'''
QTableWidget是QTableView的子類
添加了很多API,支持MVC模式,也支持非MVC模式,即資料直接添加到控制元件上
'''
class TableWidget(QWidget):
def __init__(self):
super(TableWidget, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('在單元格中放置控制元件')
self.resize(430, 300)
layout = QHBoxLayout()
tableWidget = QTableWidget()
# 4行3列
tableWidget.setRowCount(4)
tableWidget.setColumnCount(3)
tableWidget.setHorizontalHeaderLabels(['name','age','weigh(kg)'])
textItem=QTableWidgetItem('小明')
#setItem:將文本放到單元格中
tableWidget.setItem(0,0,textItem)
#下拉框
combox=QComboBox()
combox.addItem('男')
combox.addItem('女')
#setStyleSheet設定控制元件的樣式(QSS)(類似于web中的CSS),即Qt StyleSheet(n.樣式表)
combox.setStyleSheet('QComboBox{margin:3px};')#設定控鍵距離上下左右的單元格的距離(距離)
#setCellWidget:將控制元件放到單元格中
tableWidget.setCellWidget(0,1,combox)
modifyButton=QPushButton('修改')
#默認是按下的狀態
modifyButton.setDown(True)
modifyButton.setStyleSheet('QPushButton{margin:3px};')
tableWidget.setCellWidget(0,2,modifyButton)
layout.addWidget(tableWidget)
self.setLayout(layout)
if __name__=='__main__':
app=QApplication(sys.argv)
main=TableWidget()
main.show()
sys.exit(app.exec_())
運行結果:

六.在表格中搜索Cell和行定位
在表格中快速定位到特定的行
1.資料的定位: findItems ,回傳一個串列
2.如果找到了滿足條件的單元格,會定位到單元格所在的行: setSliderPosition(row)
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class DataLocation(QWidget):
def __init__(self):
super(DataLocation, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('在表格中搜索Cell和行定位')
self.resize(600, 800)
layout = QHBoxLayout()
tableWidget=QTableWidget()
tableWidget.setRowCount(40)
tableWidget.setColumnCount(4)
for i in range(40):
for j in range(4):
itemContent='(%d,%d)'%(i,j)
tableWidget.setItem(i,j,QTableWidgetItem(itemContent))
self.setLayout(layout)
#搜索滿足條件的Cell
text='(13,1)'
text1='(1,'
#引數一:要匹配的文本 ; 引數二:搜索模式,回傳一個串列
#items=tableWidget.findItems(text,Qt.MatchExactly)#搜索模式設為精確匹配,必須一模一樣才行
items = tableWidget.findItems(text1, Qt.MatchStartsWith)#搜索模式為匹配以...為開頭的字串,這里看text1,即以(1,開頭的的字串
length=len(items)
if length>0:
print('匹配項個數:',len(items))
for i in range(length):
item = items[i]
# 背景色
item.setBackground(QBrush(QColor(0, 255, 0))) # rgb
# 前景色,即文字的顏色
item.setForeground(QBrush(QColor(255, 0, 0)))
# 當前項所在的行
row = item.row()
# 定位到指定的行
tableWidget.verticalScrollBar().setSliderPosition(row)
layout.addWidget(tableWidget)
self.setLayout(layout)
if __name__=='__main__':
app=QApplication(sys.argv)
main=DataLocation()
main.show()
sys.exit(app.exec_())
運行結果:
![]()
七.設定單元格字體和顏色
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class CellFontAndColor(QWidget):
def __init__(self):
super(CellFontAndColor, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('設定單元格字體和顏色')
self.resize(430, 230)
layout = QHBoxLayout()
tableWidget=QTableWidget()
tableWidget.setRowCount(4)
tableWidget.setColumnCount(3)
tableWidget.setHorizontalHeaderLabels(['name','sex','weigh(kg)'])
newItem=QTableWidgetItem('小明')#單元格的資料項
newItem.setFont(QFont('Times',14,QFont.Black))#字體,字號,顏色
newItem.setForeground(QBrush(QColor(255,0,0)))
tableWidget.setItem(0,0,newItem)
newItem = QTableWidgetItem('女')
newItem.setForeground(QBrush(QColor(255, 255, 0)))
newItem.setBackground(QBrush(QColor(0,0,255)))#rgb
tableWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('100')
newItem.setFont(QFont('Times', 20, QFont.Black))
newItem.setForeground(QBrush(QColor(0, 0, 255)))
tableWidget.setItem(0, 2, newItem)
layout.addWidget(tableWidget)
self.setLayout(layout)
if __name__=='__main__':
app=QApplication(sys.argv)
main=CellFontAndColor()
main.show()
sys.exit(app.exec_())
運行結果:

八.按表格的某一列排序
按列排序
1.按哪一列排序
2.排序型別:升序或降序
sortItems( columnIndex,orderType)
代碼:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class CellFontAndColor(QWidget):
def __init__(self):
super(CellFontAndColor, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('設定單元格字體和顏色')
self.resize(540, 230)
layout = QHBoxLayout()
self.tableWidget=QTableWidget()#表格物件
self.tableWidget.setRowCount(4)
self.tableWidget.setColumnCount(3)
self.tableWidget.setHorizontalHeaderLabels(['name','sex','weigh(kg)'])
#添加資料
newItem=QTableWidgetItem('張三')
self.tableWidget.setItem(0,0,newItem)
newItem = QTableWidgetItem('男')
self.tableWidget.setItem(0, 1, newItem)
newItem = QTableWidgetItem('165')
self.tableWidget.setItem(0, 2, newItem)
newItem = QTableWidgetItem('李四')
self.tableWidget.setItem(1, 0, newItem)
newItem = QTableWidgetItem('女')
self.tableWidget.setItem(1, 1, newItem)
newItem = QTableWidgetItem('120')
self.tableWidget.setItem(1, 2, newItem)
newItem = QTableWidgetItem('王五')
self.tableWidget.setItem(2, 0, newItem)
newItem = QTableWidgetItem('男')
self.tableWidget.setItem(2, 1, newItem)
newItem = QTableWidgetItem('130')
self.tableWidget.setItem(2, 2, newItem)
#點擊按鈕排序
self.btn=QPushButton('升序')
self.btn.clicked.connect(self.order)
#常量
self.orderType=Qt.DescendingOrder
layout.addWidget(self.tableWidget)
layout.addWidget(self.btn)
self.setLayout(layout)
#升降序來回切換
def order(self):
if self.orderType == Qt.DescendingOrder:
self.orderType=Qt.AscendingOrder
self.btn.setText('降序')#重命名按鈕名,setText設定按鈕顯示文本
else:
self.orderType = Qt.DescendingOrder
self.btn.setText('升序')
#print(Qt.DescendingOrder)
#print(self.orderType)
self.tableWidget.sortItems(2,self.orderType)#按照第三列的資料項排序
#self.tableWidget.sortItems(2, Qt.DescendingOrder)
if __name__=='__main__':
app=QApplication(sys.argv)
main=CellFontAndColor()
main.show()
sys.exit(app.exec_())
運行結果:
點擊排序每次是升序和降序依次切換,
(初始狀態)
(升序后)
(降序后)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/255672.html
標籤:python
