qt - 在QTableView中,什么 "signal"触发编辑模式

标签 qt inheritance qt4 signals-slots qtableview

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

void edit ( const QModelIndex & index )

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

不过,似乎只有直接调用A::edit时,程序才能进入。

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

我尝试连接“已激活”信号,但显然这不是触发编辑模式的正确信号。每次编辑器被触发时是否都要做一些事情?

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

void editorDestroyed ( QObject * editor )

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

最佳答案

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 项目 View 有很多类似的方法,因此不要假设您看到的第一个方法将完全按照您想要/期望的方式执行。

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

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() 来执行此操作,以查看何时调用哪些函数。

关于qt - 在QTableView中,什么 "signal"触发编辑模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12380107/

相关文章:

java - JAXB 无法识别类型继承

sql-server-2008 - 如何使用 qt 连接到 SQL Server 2008?

qt - 使用 PyQt 连接 QTableView selectionChanged 信号会产生段错误

c++ - 获取 QTextEdit 的包装线

QTextBrowser - 如何从鼠标点击位置识别图像

c++关于在自身中嵌入结构名称的困惑

c++ - 如何通过定义派生类的构造函数来实例化两个基类的私有(private)数据成员?

python-2.7 - PyQt4:避免将项目添加到 QComboBox()

c++ - QScopedPointer、boost::scoped_ptr - 为什么提示类型不完整?

c++ - 如何在 Qt 的列表列表中推送值?