pyqt qtableview 添加下拉框控件_PyQt5学习笔记(十)表格控件与树控件

显示二维数据(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_())

运行效果:

c2631292f432c03dcb50ba6d9f2a7784.png

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_())

运行效果:

21a3ff6e09db9f28161a3997bbc5f7d8.png

此处使用了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_())

运行结果:

e6a7e2459edf13c99346688beebfc821.png

这个例子中我们选择了第五项,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_())

运行效果:

e17cfa86f291e663d62d7a1040e47d7c.png

我们发现这些格子是可以编辑的,我们也可以设置使其不能被编辑:

tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

只要增加这句话,那么表格就不能被编辑。

除此之外,QTableWidget控件还有其他的属性可以设置,比如使得光标一下选中一整行:

tablewidget.setSelectionBehavior(QAbstractItemView.SelectRows)

运行效果:

ff6cd84096f27266de89998182d49e03.png

还可以根据表格中的数据,自动调整表格的大小:

tablewidget.resizeColumnsToContents()   # 行自适应调整尺寸
tablewidget.resizeRowsToContents()      # 列自适应调整尺寸

运行效果:

d31d3c2af4f6437f8e7b0c25f79371ec.png

隐藏左侧(垂直)的序号列:

tablewidget.verticalHeader().setVisible(False)

运行效果:

70895f07ab2fe8f94d03f97afb4ddbca.png

自定义左侧的序号列:

tablewidget.setVerticalHeaderLabels(['①', '②', '③', '④'])

运行结果:

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值