【问题标题】:How can I amend an object of my model by double clicking on it in the view如何通过在视图中双击来修改模型的对象
【发布时间】:2019-12-25 10:30:17
【问题描述】:

我有一个 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_())

【问题讨论】:

  • 嗨 eyllanesc,我用一个可重复的最小示例编辑了我的问题,谢谢

标签: python pyqt pyqt5 qtableview qabstracttablemodel


【解决方案1】:

QTableView(继承自 QAbstractItemView)具有 doubleClicked 信号,当双击表格中的单元格时发出该信号,并传递被单击的 QModelIndex。 https://doc.qt.io/qt-5/qabstractitemview.html#doubleClicked

您应该将 tableView 的此信号连接到模型中的函数,如果带有布尔字段的列与索引匹配,则为模型数据中的相应行切换它。

【讨论】:

  • 谢谢!我在我的视图 self.doubleClicked.connect(self.slotDoubleClicked) 中使用了以下内容。当我双击一个单元格时,函数 slotDoubleClicked 被启动并打印“在控制台上双击”。但是我现在如何检索单击的对象并修改其字段?
  • 如何检索我双击的 QModelIndex ?
  • 给你的函数slotDoubleClicked添加一个参数,它会等于调用时被点击的QModelIndex。所以像这样:python def slotDoubleClicked(self, index): if index.isValid(): do_something() pyqt 中的信号/插槽通过查看您连接的方法的签名来连接。它将根据你的函数接受的参数传递信号的参数,并且总是有几个重载选项,即无参数、一个参数、所有参数等。
  • 谢谢!最后一件事现在我已经在我的视图中检索了我的索引,我该如何修改相应对象的内容?如何使用模型方法?
  • 您可以在表格视图类中调用 self.model() 以获得对连接模型的引用,然后您可以在其上调用函数。
猜你喜欢
  • 2011-12-03
  • 2022-08-18
  • 1970-01-01
  • 2018-06-24
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多