我正在尝试从QTableView编写一些Inherit类(我们称之为A),并希望覆盖插槽
来自QAbstractItemView的void edit(const QModelIndex& index)
。我知道这个函数可以触发编辑模式,但这是我的问题:我希望每当用户在这个A类中触发编辑模式时,程序就可以进入被覆盖的插槽 A :: edit
然而,似乎只有在直接调用 A :: edit 时,程序才能进入。
由于QTableView来自QAbstractItemView,如果编辑模式是通过其他方式触发的(例如鼠标双击),程序将运行默认的 QAbstractItemView :: edit 而不是 A ::修改
我试图连接“激活”信号,但显然它不是触发编辑模式的正确信号。无论如何,每当触发编辑器时都会做某事吗?
此外,我想在编辑模式结束时按Enter或ESC或鼠标点击其他地方。插槽中也会出现同样的情况
void editorDestroyed(QObject * editor)
任何人都可以帮我解决这个问题吗? 我真的很感激,谢谢!
答案 0 :(得分:4)
QAbstractItemView :: edit(const QModelIndex& index)不是virtual,所以当你直接调用它时,你会得到子类的行为,但是当现有代码调用它时,它们会得到它们的基类行为。如果那不响铃,请阅读该链接; Qt有很多虚拟和非虚拟功能,知道它们之间的区别会给你带来很多麻烦。
但是,QAbstractItemView::edit(const QModelIndex& index, EditTrigger trigger, QEvent* event) 是虚拟的,因此您可以覆盖它。我还没有验证它,但可能是非虚拟的edit()调用了这个edit(),所以它应该具有相同的效果。
QAbstractItemView :: editorDestroyed(QObject *编辑器)也是虚拟的,所以我不确定它为什么不起作用。但是,还有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()来查看在何时调用哪些内容。