在QTableView中,什么;“信号”;触发编辑模式

在QTableView中,什么;“信号”;触发编辑模式,qt,inheritance,qt4,signals-slots,qtableview,Qt,Inheritance,Qt4,Signals Slots,Qtableview,我试图从QTableView编写一些继承类(我们称之为A),并希望覆盖插槽 无效编辑(常量QModelIndex和索引) 从qabstractemview。我知道这个函数可以触发编辑模式,但我的问题是:我希望每当这个类A中的用户触发编辑模式时,程序都可以进入覆盖槽A::edit 但是,似乎只有直接调用A::edit时,程序才能进入 由于QTableView来自QabstratemView,如果编辑模式通过其他方式触发(如鼠标双击),程序将运行默认的QabstratemView::edit,而不是

我试图从QTableView编写一些继承类(我们称之为A),并希望覆盖插槽

无效编辑(常量QModelIndex和索引)

从qabstractemview。我知道这个函数可以触发编辑模式,但我的问题是:我希望每当这个类A中的用户触发编辑模式时,程序都可以进入覆盖槽A::edit

但是,似乎只有直接调用A::edit时,程序才能进入

由于QTableView来自QabstratemView,如果编辑模式通过其他方式触发(如鼠标双击),程序将运行默认的QabstratemView::edit,而不是A::edit

我试图连接信号“激活”,但显然它不是触发编辑模式的正确信号。是否每次触发编辑器时都要执行某些操作

另外,当编辑模式结束时,我想通过按Enter键或ESC键或鼠标单击其他位置来完成一些操作。同样的情况也发生在投币口

void editorDestroyed(QObject*编辑器)

有人能帮我解决这个问题吗? 我会非常感激的,谢谢

qabstractemview::edit(const QModelIndex&index)不是,所以当您直接调用它时,您会得到子类的行为,但当现有代码调用它时,它们会得到基类的行为。如果这还没有敲响警钟,请阅读该链接;Qt有很多虚拟和非虚拟功能,知道它们的区别会让你省去很多麻烦

但是,它是虚拟的,因此您可以覆盖它。我还没有验证它,但非虚拟edit()可能会调用此edit(),因此它应该具有相同的效果

QabstracteView::editorDestroyed(QObject*editor)也是虚拟的,所以我不知道为什么它不能工作。然而,还有一个虚拟的,所以您可能想尝试在您的子类中重新实现它。closeEditor()文档还建议commitData(),它也是虚拟的。Qt项视图有很多类似的方法,所以不要假设您看到的第一个方法将完全满足您的期望

仅供参考,如果您不习惯在子类中重新实现虚拟方法,确保调用您的实现的最快/最简单的方法是执行以下操作:

class A : public QTableView {
    void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) {
        qDebug("my closeEditor was called!");
        // call the real implementation so that the base class continues to work properly
        QTableView::closeEditor(editor, hint);
    }
};
您可以使用edit()、editorDestroyed()、closeEditor()和commitData()来执行此操作,以查看何时调用了哪些子类。

qabstractemview::edit(const QModelIndex&index)不是,因此,当您直接调用它时,您会得到子类的行为,但当现有代码调用它时,它们会得到基类的行为。如果这还没有敲响警钟,请阅读该链接;Qt有很多虚拟和非虚拟功能,知道它们的区别会让你省去很多麻烦

但是,它是虚拟的,因此您可以覆盖它。我还没有验证它,但非虚拟edit()可能会调用此edit(),因此它应该具有相同的效果

QabstracteView::editorDestroyed(QObject*editor)也是虚拟的,所以我不知道为什么它不能工作。然而,还有一个虚拟的,所以您可能想尝试在您的子类中重新实现它。closeEditor()文档还建议commitData(),它也是虚拟的。Qt项视图有很多类似的方法,所以不要假设您看到的第一个方法将完全满足您的期望

仅供参考,如果您不习惯在子类中重新实现虚拟方法,确保调用您的实现的最快/最简单的方法是执行以下操作:

class A : public QTableView {
    void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) {
        qDebug("my closeEditor was called!");
        // call the real implementation so that the base class continues to work properly
        QTableView::closeEditor(editor, hint);
    }
};

您可以使用edit()、editorDestroyed()、closeEditor()和commitData()来执行此操作,以查看何时调用哪一个。

非常感谢!我不明白为什么编辑也不工作,也许是我弄错了。明天我将尝试虚拟编辑、closeEditor和commitData,并让您知道它是否有效:)我已经测试过:)虚拟编辑和closeEditor插槽有效!!!!我想编辑编辑没有用,因为编辑刚刚被关闭,但没有被销毁。非常感谢!我不明白为什么编辑也不工作,也许是我弄错了。明天我将尝试虚拟编辑、closeEditor和commitData,并让您知道它是否有效:)我已经测试过:)虚拟编辑和closeEditor插槽有效!!!!我认为编辑被删除不起作用,因为编辑刚刚被关闭,但没有被销毁。