1、顯示二維列表數據(QTableView)控件
'''
顯示二維列表數據(QTableView)控件
數據源
model
需要創建一個QTableView實例和一個數據源model,然后將其兩者關聯
MVC模式 model viewer controller 前后端關聯
MVC的目的是將后端的數據和前端頁面的耦合度降低
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class tableview(QWidget):
def __init__(self):
super(tableview, self).__init__()
self.setWindowTitle("QTableView表格視圖控件演示")
self.resize(600,500)
self.model=QStandardItemModel(5,3) #創建一個標准的數據源model
self.model.setHorizontalHeaderLabels(["id","姓名","年齡"]) #設置表格的表頭名稱
self.tableview=QTableView()
#關聯model和tableview控件
self.tableview.setModel(self.model)
#添加數據
#首先定義字符類數據
item11=QStandardItem("10")
item12=QStandardItem("雷神")
item13=QStandardItem("2000")
#其次將定義好的的數據添加到數據源model中
self.model.setItem(0,0,item11)
self.model.setItem(0,1,item12)
self.model.setItem(0,2,item13)
layout=QVBoxLayout()
layout.addWidget(self.tableview)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=tableview()
p.show()
sys.exit(app.exec_())

2、顯示一維列表數據
'''
顯示列表數據控件QListView控件
'''
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QStringListModel
import sys
class Listview(QWidget):
def __init__(self):
super(Listview,self).__init__()
self.setWindowTitle("QlistView列表展現控件演示")
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.click)
layout.addWidget(listview)
self.setLayout(layout)
def click(self,item):
QMessageBox.information(self,"QListView","您選擇了"+self.list[item.row()])
print("hello world")
if __name__=="__main__":
app=QApplication(sys.argv)
p=Listview()
p.show()
sys.exit(app.exec_())

3、擴展的表格控件QTableWidget控件
'''
顯示擴展的列表數據控件QTableWidget控件
cell是指一個單元格QTableWidgetItem
'''
from PyQt5.QtWidgets import *
import sys
class Tablewidget(QWidget):
def __init__(self):
super(Tablewidget,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget擴展表格控件演示")
self.resize(430,230)
#定義一個擴展的單元格控件
tablewidget=QTableWidget()
# 設置表格的行和列數
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
layout = QVBoxLayout()
layout.addWidget(tablewidget)
#設置表格控件的列表頭名稱
tablewidget.setHorizontalHeaderLabels(["姓名","年齡","籍貫"])
#定義單元格的內容
nameitem=QTableWidgetItem("小明")
tablewidget.setItem(0,0,nameitem)
ageitem=QTableWidgetItem("23")
tablewidget.setItem(0,1,ageitem)
jgitem=QTableWidgetItem("北京")
tablewidget.setItem(0,2,jgitem)
#禁止編輯
tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
#整行顯示
tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)
#整列顯示
tablewidget.setSelectionBehavior(QAbstractItemView.SelectColumns)
#自適應調整行和列的大小
tablewidget.resizeColumnsToContents()
tablewidget.resizeRowsToContents()
#隱藏行和列的表頭
#tablewidget.horizontalHeader().setVisible(False)
#tablewidget.verticalHeader().setVisible(False)
#設置行的表頭名稱
tablewidget.setVerticalHeaderLabels(["a","B"])
#隱藏表格線
tablewidget.setShowGrid(False)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=Tablewidget()
p.show()
sys.exit(app.exec_())

4、擴展的表格控件QListWidget控件
'''
顯示擴展的列表數據控件QListWidget控件
'''
from PyQt5.QtWidgets import *
import sys
class Listviewdemo(QMainWindow):
def __init__(self):
super(Listviewdemo,self).__init__()
self.setWindowTitle("QlistView列表展現控件演示")
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.setCentralWidget(self.listwidget)
self.listwidget.itemClicked.connect(self.click)
#print(self.listwidget.item(self.listwidget.row()).text())
def click(self,index):
QMessageBox.information(self,"QListWidget","您選擇了"+self.listwidget.item(self.listwidget.row(Index)).text())
if __name__=="__main__":
app=QApplication(sys.argv)
p=Listviewdemo()
p.show()
sys.exit(app.exec_())

5、設置單元格顏色和字體
'''
設置單元格顏色和顏色
'''
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtGui import QColor,QBrush,QFont
import sys
class setfontandcolor(QWidget):
def __init__(self):
super(setfontandcolor,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("設置單元格字體和顏色")
self.resize(430,230)
layout=QHBoxLayout() #列布局
tablewidget=QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
layout.addWidget(tablewidget)
tablewidget.setHorizontalHeaderLabels(["姓名","性別","體重"])
name=QTableWidgetItem("雷神")
name.setFont(QFont("Times",14,QFont.Black)) #設置字體大小和樣式
name.setForeground(QBrush(QColor(255,0,0))) #設置字體的其他顏色
tablewidget.setItem(0,0,name)
sex=QTableWidgetItem("女")
sex.setForeground(QBrush(QColor(255,255,0))) #設置字體顏色
sex.setBackground(QBrush(QColor(0,0,255))) #設置字體的背景顏色
tablewidget.setItem(0,1,sex)
weight=QTableWidgetItem("160")
weight.setFont(QFont("Airal",30)) #設置字體的大小和顯示樣式
weight.setForeground(QBrush(QColor(255,0,0)))
tablewidget.setItem(0,2,weight)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=setfontandcolor()
p.show()
sys.exit(app.exec_())

6、設置單元格尺寸大小
'''
設置改變單元格尺寸大小,以顯示完整的文本內容
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QColor,QBrush,QFont
import sys
class setfontandcolor(QWidget):
def __init__(self):
super(setfontandcolor,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("設置單元格尺寸")
self.resize(430,230)
layout=QHBoxLayout() #列布局
tablewidget=QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
layout.addWidget(tablewidget)
tablewidget.setHorizontalHeaderLabels(["姓名","性別","體重"])
#修改單元格的尺寸大小,通過改變行和列的尺寸即可實現
tablewidget.setRowHeight(0,100) #該表第一行的高度
tablewidget.setColumnWidth(2,120) #修改第2列的寬度
tablewidget.setRowHeight(2,100)
name=QTableWidgetItem("雷神")
name.setFont(QFont("Times",30,QFont.Black)) #設置字體大小和樣式
name.setForeground(QBrush(QColor(255,0,0))) #設置字體的其他顏色
tablewidget.setItem(0,0,name)
sex=QTableWidgetItem("女")
sex.setForeground(QBrush(QColor(255,255,0))) #設置字體顏色
sex.setBackground(QBrush(QColor(0,0,255))) #設置字體的背景顏色
tablewidget.setItem(0,1,sex)
weight=QTableWidgetItem("160")
weight.setFont(QFont("Airal",20)) #設置字體的大小和顯示樣式
weight.setForeground(QBrush(QColor(255,0,0)))
tablewidget.setItem(0,2,weight)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=setfontandcolor()
p.show()
sys.exit(app.exec_())

7、單元格中放置控件setCellWidget控件
'''
setCellWidget:單元格中放到控件使用
setItem:將文本放置到單元格中去
setStyleSheet:設置控件樣式
'''
from PyQt5.QtWidgets import *
import sys
class placetool(QWidget):
def __init__(self):
super(placetool,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("在單元格中放置控件")
self.resize(430,300)
layout=QHBoxLayout() #水平布局
tablewidget=QTableWidget()
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
layout.addWidget(tablewidget)
tablewidget.setHorizontalHeaderLabels(["姓名","性別","體重"])
#單元格中設置文本內容方法
textitem=QTableWidgetItem("小明")
tablewidget.setItem(0,0,textitem)
#單元格中放置下拉控件方法
combox=QComboBox()
combox.addItem("男")
combox.addItem("女")
#單元格中設置下拉控件的樣式
combox.setStyleSheet("QcomBox{margin:3px};")
tablewidget.setCellWidget(0,1,combox)
modifybutton=QPushButton("修改")
modifybutton.setDown(True)
modifybutton.setStyleSheet('QPushButton{margin:3px};')
tablewidget.setCellWidget(0,2,modifybutton)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=placetool()
p.show()
sys.exit(app.exec_())

8、單元格中文本的對齊方式
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class tablealignment(QWidget):
def __init__(self):
super(tablealignment,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("單元格按列排序")
self.resize(1000,500)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
self.tablewidget.setRowCount(4)
self.tablewidget.setColumnCount(3)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["省份","增加人數","患病累計人數"])
new=QTableWidgetItem("北京")
new.setTextAlignment(Qt.AlignRight | Qt.AlignBottom) #設置右對齊方式和底下對齊
self.tablewidget.setItem(0,0,new)
new1 = QTableWidgetItem("5")
new1.setTextAlignment(Qt.AlignCenter | Qt.AlignBottom) #設置中間對齊方式和底層對齊
self.tablewidget.setItem(0,1,new1)
new2= QTableWidgetItem("356")
new2.setTextAlignment(Qt.AlignLeft) #設置左對齊方式和底下對齊
self.tablewidget.setItem(0,2,new2)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=tablealignment()
p.show()
sys.exit(app.exec_())

9、設置單元格某一列排序
'''
設置單元格某一列排序
1.按哪一列進行排序
2.排序的類型:升序或者降序
sortItems(columnindex,orderType)函數方法
'''
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class columnsort(QWidget):
def __init__(self):
super(columnsort,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("單元格按列排序")
self.resize(1000,500)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
self.tablewidget.setRowCount(4)
self.tablewidget.setColumnCount(3)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["省份","增加人數","患病累計人數"])
new=QTableWidgetItem("北京")
self.tablewidget.setItem(0,0,new)
new1 = QTableWidgetItem("5")
self.tablewidget.setItem(0,1,new1)
new2= QTableWidgetItem("356")
self.tablewidget.setItem(0,2,new2)
new = QTableWidgetItem("甘肅")
self.tablewidget.setItem(1, 0, new)
new1 = QTableWidgetItem("3")
self.tablewidget.setItem(1,1, new1)
new2 = QTableWidgetItem("85")
self.tablewidget.setItem(1, 2, new2)
new = QTableWidgetItem("湖北")
self.tablewidget.setItem(2, 0, new)
new1 = QTableWidgetItem("2061")
self.tablewidget.setItem(2, 1, new1)
new2 = QTableWidgetItem("31234")
self.tablewidget.setItem(2, 2, new2)
self.button1=QPushButton("按日增排序")
self.button = QPushButton("按總數排序")
self.button1.clicked.connect(self.order)
self.button.clicked.connect(self.order)
layout.addWidget(self.button)
layout.addWidget(self.button1)
self.orderType=Qt.DescendingOrder #設置默認的排序方式為降序
self.setLayout(layout)
def order(self):
if self.orderType == Qt.DescendingOrder:
self.orderType=Qt.AscendingOrder #設置為升序
else:
self.orderType=Qt.DescendingOrder
#單元格某一列排序函數方法設置
self.tablewidget.sortItems(2,self.orderType)
if __name__=="__main__":
app=QApplication(sys.argv)
p=columnsort()
p.show()
sys.exit(app.exec_())

10、合並單元格
'''
合並單元格
setSpan(row,column,要合並的行數,要合並的列數)
'''
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class span(QWidget):
def __init__(self):
super(span,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("單元格按列排序")
self.resize(1000,500)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
self.tablewidget.setRowCount(4)
self.tablewidget.setColumnCount(3)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["省份","增加人數","患病累計人數"])
new=QTableWidgetItem("北京")
self.tablewidget.setItem(0,0,new)
new1 = QTableWidgetItem("5")
self.tablewidget.setItem(0,1,new1)
new2= QTableWidgetItem("356")
self.tablewidget.setItem(0,2,new2)
self.tablewidget.setSpan(0, 0, 3, 1)
self.tablewidget.setSpan(0, 1, 2, 1) #合並單元格函數方法參數設置
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=span()
p.show()
sys.exit(app.exec_())

11、單元格搜索
'''
搜索單元格中的特定位置
1、數據定位:findItems
2、如果找到了符合條件的單元格,便定位到單元格所在的行:setSliderPosition
'''
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtGui import QColor,QBrush
import sys
class Datalocation(QWidget):
def __init__(self):
super(Datalocation,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("單元格搜索定位")
self.resize(600,800)
layout=QHBoxLayout() #列布局
tablewidget=QTableWidget()
tablewidget.setRowCount(40)
tablewidget.setColumnCount(4)
layout.addWidget(tablewidget)
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)"
items=tablewidget.findItems(text,QtCore.Qt.MatchExactly) #搜索方式1
text1="(1"
items1 = tablewidget.findItems(text1, QtCore.Qt.MatchStartsWith) #s搜索方式2
if len(items1)>0:
item=items1[0]
item.setBackground(QBrush(QColor(0,255,0))) #設置背景色為綠色
item.setForeground(QBrush(QColor(255,0,0))) #設置內容為紅色
row=item.row()
#定位到行
tablewidget.verticalScrollBar().setSliderPosition(row)
if __name__=="__main__":
app=QApplication(sys.argv)
p=Datalocation()
p.show()
sys.exit(app.exec_())

12單元格圖文混排設置
'''
圖文混排
new4=QTableWidgetItem(QIcon("./image/1.png"),"研究生") #圖文混排函數方法
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class wordpicture(QWidget):
def __init__(self):
super(wordpicture,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("圖文混排")
self.resize(900,1000)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
self.tablewidget.setRowCount(3)
self.tablewidget.setColumnCount(4)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["姓明","性別","體重","圖片"])
new = QTableWidgetItem("燕江依")
self.tablewidget.setItem(0, 0, new)
new1 = QTableWidgetItem("男")
self.tablewidget.setItem(0, 1, new1)
new2 = QTableWidgetItem("55")
self.tablewidget.setItem(0, 2, new2)
# 圖文混排函數
new4=QTableWidgetItem(QIcon("./image/1.png"),"研究生") #圖文混排函數
self.tablewidget.setItem(0,3,new4)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=wordpicture()
p.show()
sys.exit(app.exec_())

13、改變單元格圖片格式
'''
改變單元格中圖片的大小尺寸
setIconSize(QSize(width,height))
'''
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class setpicture(QWidget):
def __init__(self):
super(setpicture,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("改變單元格圖片的大小")
self.resize(900,1000)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
# 設置單元格中圖片的尺寸為寬度300,高度200
self.tablewidget.setIconSize(QSize(300,200))
self.tablewidget.setRowCount(5)
self.tablewidget.setColumnCount(3)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["圖1","圖2","圖3"])
#讓列的寬度和圖片寬度相同
for i in range(3):
self.tablewidget.setColumnWidth(i,300)
# 讓行的高度和圖片高度相同
for j in range(15):
self.tablewidget.setRowHeight(j,200)
for k in range(15):
i=k/3 #行數
j=k%3 #列數
new = QTableWidgetItem()
new.setIcon(QIcon('./image/%d.png' % k))
self.tablewidget.setItem(i,j,new)
self.setLayout(layout)
if __name__=="__main__":
app=QApplication(sys.argv)
p=setpicture()
p.show()
sys.exit(app.exec_())

14、單元格中彈出上下文菜單
'''
1、如何彈出菜單
2、如何在滿足條件的情況下彈出菜單
QMenu.exec_方法
'''
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QObject,Qt
import sys
class tablemenu(QWidget):
def __init__(self):
super(tablemenu,self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("單元格中彈出上下文菜單")
self.resize(500,300)
layout=QHBoxLayout() #列布局
self.tablewidget=QTableWidget()
self.tablewidget.setRowCount(4)
self.tablewidget.setColumnCount(3)
layout.addWidget(self.tablewidget)
self.tablewidget.setHorizontalHeaderLabels(["省份","增加人數","患病累計人數"])
new=QTableWidgetItem("北京")
self.tablewidget.setItem(0,0,new)
new1 = QTableWidgetItem("5")
self.tablewidget.setItem(0,1,new1)
new2= QTableWidgetItem("356")
self.tablewidget.setItem(0,2,new2)
new = QTableWidgetItem("甘肅")
self.tablewidget.setItem(1, 0, new)
new1 = QTableWidgetItem("3")
self.tablewidget.setItem(1,1, new1)
new2 = QTableWidgetItem("85")
self.tablewidget.setItem(1, 2, new2)
new = QTableWidgetItem("湖北")
self.tablewidget.setItem(2, 0, new)
new1 = QTableWidgetItem("2061")
self.tablewidget.setItem(2, 1, new1)
new2 = QTableWidgetItem("31234")
self.tablewidget.setItem(2, 2, new2)
#設置允許單元格可以彈出菜單
self.tablewidget.setContextMenuPolicy(Qt.CustomContextMenu)
#信號連接到槽函數
self.tablewidget.customContextMenuRequested.connect(self.generatemenu)
self.setLayout(layout)
def generatemenu(self,pos):
print(pos) #輸出所單擊鼠標右鍵的坐標值
for i in self.tablewidget.selectionModel().selection().indexes(): #設置選中的單元格索引
r=i.row()
#如果選擇的行索引小於2,則彈出上下文菜單
if r<2:
menu=QMenu()
n1=menu.addAction("菜單項1")
n2 = menu.addAction("菜單項2")
n3 = menu.addAction("菜單項3")
#設置菜單顯示的坐標位置為相對於單元格的位置
screenpos=self.tablewidget.mapToGlobal(pos)
print(screenpos)
#設置選擇菜單滿足的條件
a=menu.exec_(screenpos)
if a==n1:
print("選擇了第一個菜單項",self.tablewidget.item(r,0).text(),self.tablewidget.item(r, 1).text(),self.tablewidget.item(r,2).text()) #輸出所在行各個單元格的內容
elif a == n2:
print("選擇了第二個菜單項", self.tablewidget.item(r, 0).text(), self.tablewidget.item(r, 1).text(),self.tablewidget.item(r, 2).text())
elif a==n3:
print("選擇了第三個菜單項",self.tablewidget.item(r,0).text(),self.tablewidget.item(r, 1).text(),self.tablewidget.item(r,2).text())
else:
return
if __name__=="__main__":
app=QApplication(sys.argv)
p=tablemenu()
p.show()
sys.exit(app.exec_())
