【问题标题】:In QTableView, What "signal" triggers the editing mode在QTableView中,什么“信号”触发了编辑模式
【发布时间】:2012-09-04 23:55:54
【问题描述】:

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

无效编辑(const QModelIndex & index)

来自 QAbstractItemView。我知道这个功能可以触发编辑模式,但是我的问题是:我希望每当这个A类中的用户触发编辑模式时,程序可以进入被覆盖的插槽A::edit .

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

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

我尝试连接“激活”信号,但显然它不是触发编辑模式的正确信号。每次触发编辑器时有什么办法吗?

另外,我想在编辑模式结束时做一些事情,按 Enter 或 ESC 或鼠标点击其他地方。同样的情况也发生在slot

void editorDestroyed(QObject * editor)

谁能帮我解决这个问题? 非常感谢,谢谢!

【问题讨论】:

    标签: qt inheritance qt4 signals-slots qtableview


    【解决方案1】:

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

    但是,QAbstractItemView::edit(const QModelIndex& index, EditTrigger trigger, QEvent* event) 虚拟的,所以你可以覆盖它。我没验证过,但想必非虚拟的edit()调用了这个edit(),所以应该是一样的效果。

    QAbstractItemView::editorDestroyed(QObject* editor) 也是虚拟的,所以我不确定它为什么不起作用。但是,还有 QAbstractItemView::closeEditor(QWidget* editor, QAbstractItemDelegate::EndEditHint hint) 也是虚拟的,因此您可能想尝试在您的子类中重新实现它。 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() 来执行此操作,以查看何时调用了哪些。

    【讨论】:

    • 非常感谢!我不明白为什么 editorDestroyed 也不起作用,也许我犯了一些错误。明天我会尝试虚拟编辑、closeEditor 和 commitData 并让你知道它是否有效:)
    • 我已经测试过了 :) 虚拟编辑和 closeEditor 插槽有效!!!!我认为 editorDestroyed 不起作用,因为编辑器刚刚关闭但没有销毁。
    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2021-07-04
    相关资源
    最近更新 更多