python - 如何通过在视图中双击来修改模型的对象
问题描述
我有一个 QTableView 显示一个 QAbstractTableModel 代表我的对象列表。我的对象的一个属性是布尔值(isExpired),我只想在双击表格视图中的特定单元格时修改此属性。因此,在 myTableView 上,如果双击与我的对象编号 1 对应的行的 isExpired 列中的单元格,我希望此属性从 False 变为 True。
import sys
import os
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QTableView
from PyQt5.QtCore import QAbstractTableModel, Qt
import pandas as pd
class Test:
def __init__(self):
self.id = ""
self.isExpired = ""
def toDataframe(self):
return{
'Id': self.id,
'isExpired': self.isExpired}
class Tests:
def __init__(self):
self.tests = []
test1 = Test()
test1.id = 1
test1.isExpired = False
self.tests.append(test1)
def toDataframe(self):
tickets_df = pd.DataFrame.from_records([t.toDataframe() for t in self.tests])
tickets_df = tickets_df[['Id', 'isExpired']]
return tickets_df
class MyTableView(QTableView):
def __init__(self, *args):
QTableView.__init__(self, *args)
# Table model
class TicketGUI(QAbstractTableModel):
def __init__(self):
QAbstractTableModel.__init__(self)
self.tickets = Tests()
data = self.tickets.toDataframe()
self._data = data
def rowCount(self, parent=None):
return self._data.shape[0]
def columnCount(self, parent=None):
return self._data.shape[1]
def data(self, index, role=Qt.DisplayRole):
if index.isValid():
if role == Qt.DisplayRole:
return str(self._data.iloc[index.row(), index.column()])
def headerData(self, col, orientation, role=Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self._data.columns[col]
return None
if __name__ == 'main':
app = QApplication(sys.argv)
model = TicketGUI()
view = MyTableView()
view.setModel(model)
view.show()
sys.exit(app.exec_())
解决方案
QTableView(继承自 QAbstractItemView)具有 doubleClicked 信号,当双击表格中的单元格时发出该信号,并传递被单击的 QModelIndex。https://doc.qt.io/qt-5/qabstractitemview.html#doubleClicked
您应该将 tableView 的此信号连接到模型中的函数,如果带有布尔字段的列与索引匹配,则为模型数据中的相应行切换它。
推荐阅读
- django - 具有两个独立列的 DRF 关系
- python - 我怎样才能更快地完成这个程序?
- excel - 如何将某些单词从 Excel 填充到 Outlook 电子邮件模板?
- swift - 选择/取消选择按钮时,如何隐藏/显示我的工具栏项目?
- sql - 将 Oracle 转换为 T-SQL 以获得每月的总浏览量
- r - R:我可以更新 magrittr 管道中对象的类吗?
- python-3.x - 通过 Pandas Datareader (Python) 连接到 Iex API
- angular - 无法运行 Angular 项目 [Angular 6]
- php - 如何在 laravel 中添加“状态”、“消息”
- javascript - 如何在javascript中将二维数组转换为二维字符串