gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:30:20 25 4
gpt4 key购买 nike

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

void edit ( const QModelIndex & index )

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

不过好像只有直接调用A::edit程序才能进去。

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

我尝试连接“已激活”信号,但显然这不是触发编辑模式的正确信号。无论如何,每次触发编辑器时都要做些什么吗?

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

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 有很多类似的方法,所以不要假设您看到的第一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com