我正在尝试从 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/