显示二维数据(QTableView)
需要创建QTableView
实例和一个数据源Model
,然后将两者关联。其运行机制类似于MVC模式。
MVC模式:Model(数据) Viewer(UI) Controller
MVC的目的是将后端的数据和前端的耦合度降低。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class TableView(QWidget):
def __init__(self):
super(TableView, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableView表格试图控件演示")
self.resize(550, 300)
# 设置表格,可填充数据为4*3
self.model = QStandardItemModel(4, 3)
self.model.setHorizontalHeaderLabels(['id', '姓名', '年龄'])
self.tableview = QTableView()
# 关联QTableView控件和Model
self.tableview.setModel(self.model)
# 添加数据
item11 = QStandardItem('10')
item12 = QStandardItem('AA')
item13 = QStandardItem('20')
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)
main = TableView()
main.show()
sys.exit(app.exec_())
运行效果:
QStandardItemModel(4, 3)
相当于创建了一个4*3的表格(不包括说明的文字)。然后对表格(model
对象)的数据填充(每一个格子的数据是QStandItem
对象)都是model这个步骤中的;最后通过QTableView
创建view,通过setModel()
将model和view关联起来,最后加入主窗口的控件时view。这样,我们创建的表格和主窗口的关系只是松耦合。
显示列表数据(QListView)
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ListViewDemo(QWidget):
def __init__(self):
super(ListViewDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QListView演示")
self.resize(550, 300)
layout = QVBoxLayout()
# 创建view
listview = QListView()
# 创建model
listModel = QStringListModel()
self.list = ["列表项1", "列表项2", "列表项3"]
listModel.setStringList(self.list)
# 关联view和model
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 = ListViewDemo()
main.show()
sys.exit(app.exec_())
运行效果:
此处使用了QListView
创建了关联列表的view,然后使用QStringListModel()
可以创建列表model。setStringList
则是往model中添加数据,数据类型为列表。
扩展的列表控件(QListWidget)
扩展的列表控件(QListWidget)支持两种增添数据的方式:MVC模式和非MVC模式。
而且QListWidget本身就是QListView的子类:
class QListWidget(QListView)
相比于其父类,QListWidget更加灵活,增添了行数据变化和列数据变化等数据变化有关的信号;支持数据插入;支持非MVC模式的数据增添。
下面演示使用扩展控件QListWidget的非MVC模式创建列表
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ListWidgetDemo(QMainWindow):
def __init__(self):
super(ListWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QListWidget演示")
self.resize(300, 300)
self.listwidget = QListWidget()
self.listwidget.resize(300, 120)
# 使用addItem一下增添一个
self.listwidget.addItem("item1")
self.listwidget.addItem("item2")
# 使用addItems一下增添多个
self.listwidget.addItems(["item3", "item4", "item5"])
self.listwidget.itemClicked.connect(self.clicked)
self.setCentralWidget(self.listwidget)
def clicked(self, index):
QMessageBox.information(self, "QListWidget", "您选择了" + self.listwidget.item(self.listwidget.row(index)).text())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ListWidgetDemo()
main.show()
sys.exit(app.exec_())
运行结果:
这个例子中我们选择了第五项,self.listwidget.row(index)
的值便是4
扩展的表格控件(QTableWidget)
QTableWidget(扩展的表格控件)是QTableView控件的子类。可以通过非MVC的方式往控件中添加数据。
每一个单元格都是一个QTableWidgetItem
对象,这意味着我们每添加一个单元格的数据都需要创建一个QTableWidgetItem
对象。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class ListWidgetDemo(QWidget):
def __init__(self):
super(ListWidgetDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QTableWidget演示")
self.resize(500, 300)
layout = QHBoxLayout()
tablewidget = QTableWidget()
# 设置行数与列数
tablewidget.setRowCount(4)
tablewidget.setColumnCount(3)
# 设置标签行
tablewidget.setHorizontalHeaderLabels(['姓名', '年龄', '籍贯'])
nameItem = QTableWidgetItem("小明")
tablewidget.setItem(0, 0, nameItem)
ageItem = QTableWidgetItem("24")
tablewidget.setItem(0, 1, ageItem)
homeItem = QTableWidgetItem("北京")
tablewidget.setItem(0, 2, homeItem)
layout.addWidget(tablewidget)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ListWidgetDemo()
main.show()
sys.exit(app.exec_())
运行效果:
我们发现这些格子是可以编辑的,我们也可以设置使其不能被编辑:
tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
只要增加这句话,那么表格就不能被编辑。
除此之外,QTableWidget控件还有其他的属性可以设置,比如使得光标一下选中一整行:
tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)
运行效果:
还可以根据表格中的数据,自动调整表格的大小:
tablewidget.resizeColumnsToContents() # 行自适应调整尺寸
tablewidget.resizeRowsToContents() # 列自适应调整尺寸
运行效果:
隐藏左侧(垂直)的序号列:
tablewidget.verticalHeader().setVisible(False)
运行效果:
自定义左侧的序号列:
tablewidget.setVerticalHeaderLabels(['①', '②', '③', '④'])
运行结果: