PyQt – QTableView中的简单工作示例
在本文中,我们将介绍如何在PyQt中使用QTableView和QComboBox,并提供一个最简单的可工作的示例。
阅读更多:PyQt 教程
QTableView和QComboBox
QTableView是Qt中用于显示二维表格数据的控件。它使用模型/视图架构,其中模型存储数据并向视图提供数据。QComboBox是一个下拉列表框控件,可以让用户从预定义的选项中选择一项。
示例背景
假设我们正在开发一个学生成绩管理系统,并需要展示学生信息表格,包括学生姓名、课程名称和分数。课程名称字段应该是一个下拉列表,用户可以从预定义的课程选项中选择。
实现步骤
首先,我们需要创建一个PyQt应用程序并初始化一个QTableView。然后,我们将为学生信息表格创建一个模型,并定义其中的列。接下来,我们将为课程名称列添加一个QComboBox,并将其设置为可编辑。最后,我们将将模型设置为QTableView的模型,并显示表格。
以下是一个实现上述功能的最简单的PyQt代码示例:
import sys
from PyQt5.QtWidgets import QApplication, QTableView, QVBoxLayout, QWidget, QComboBox, QAbstractItemView
from PyQt5.QtCore import QAbstractTableModel, Qt
class StudentTableModel(QAbstractTableModel):
def __init__(self, data):
QAbstractTableModel.__init__(self)
self.data = data
self.column_names = ['姓名', '课程名称', '分数']
def rowCount(self, parent=None):
return len(self.data)
def columnCount(self, parent=None):
return len(self.column_names)
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
return self.data[index.row()][index.column()]
def headerData(self, section, orientation, role=Qt.DisplayRole):
if role == Qt.DisplayRole and orientation == Qt.Horizontal:
return self.column_names[section]
def flags(self, index):
if index.column() == 1:
return Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled
return Qt.ItemIsEnabled
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.table_view = QTableView()
layout = QVBoxLayout()
layout.addWidget(self.table_view)
self.setLayout(layout)
data = [
['张三', '数学', '90'],
['李四', '英语', '85'],
['王五', '历史', '92']
]
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = MainWindow()
model = StudentTableModel(data)
main_window.table_view.setModel(model)
combo_box = QComboBox()
combo_box.addItems(['数学', '英语', '历史'])
main_window.table_view.setItemDelegateForColumn(1, combo_box)
main_window.table_view.setEditTriggers(QAbstractItemView.AllEditTriggers)
main_window.show()
sys.exit(app.exec_())
解释示例代码
我们定义了一个名为StudentTableModel
的子类来实现表格数据模型。模型继承自QAbstractTableModel
类,并重写了几个必要的方法。rowCount
和columnCount
方法返回表格的行数和列数,data
方法返回指定单元格的数据,headerData
方法返回列的标题,并在flags
方法中设置了课程名称列的属性。
MainWindow
类继承自QWidget
类,并创建了一个QTableView
实例。然后我们通过QVBoxLayout
将表格视图添加到主窗口的布局中。
我们通过创建一个包含示例学生数据的列表,并使用StudentTableModel
类创建与该数据对应的模型实例。然后,我们将该模型设置为QTableView
的模型,以显示数据。
我们还创建了一个QComboBox
实例,并使用addItems
方法向下拉列表框中添加课程选项。接下来,我们使用setItemDelegateForColumn
方法,将QComboBox
设置为课程名称列的代理编辑器。通过设置代理编辑器,我们可以在该列中显示下拉列表框,并允许用户从中选择课程选项。
最后,我们使用setEditTriggers
方法将编辑触发器设置为QAbstractItemView.AllEditTriggers
,以便用户可以在表格中进行编辑。然后显示主窗口,并通过app.exec_()
运行应用程序。
总结
在这篇文章中,我们介绍了如何在PyQt中使用QTableView和QComboBox,并提供了一个最简单的可工作示例。通过创建自定义的数据模型并在QTableView中设置,我们可以实现表格的显示和编辑。通过将QComboBox作为列的代理编辑器,我们还能够在表格中显示下拉列表框,并允许用户进行选择。这个示例为我们展示了使用PyQt创建基本表格应用程序的基本步骤。希望这篇文章对于初学者能够有所帮助!