如何告诉 QTableWidget 结束编辑单元格?

5
我正在展示一个弹出菜单,以选择QTableWidget中的一些值。最低项是“修改列表”条目,当我选择它时,应自动出现一个新窗口,并且QComboBox应该消失,单元格返回到Qt :: DisplayRole状态。
现在Qt拥有所有这些好用的API调用,例如QTableWidget.edit()QTableWidget.editItem(),我真正寻找的是QTableWidget.endEditing(),最好不指定单元格的索引,虽然我可以使用此调用获取它:
table.currentIndex()

...但我不知道是否能保证当前单元格始终是正在编辑的单元格。

是否有一种API可以关闭这些类型的编辑器?

弹出菜单

5个回答

7

table.setCurrentItem(None)对我来说起作用了。(如果您使用了一些cellChanged/itemChanged slot函数,请不要忘记阻止信号。)

这是使用PyQt的方法。对于C++,我认为将None替换为NULL即可。


7

QTableWidget 继承了 QWidget 的 19 个公共槽。其中之一是 setDisabled(),它可以禁用该小部件及其所有子元素的输入事件。

我建议尝试以下操作:

table.setDisabled( true );
table.setDisabled( false );

虽然你说这对你没有用,但有另一种替代方法: 如果你不喜欢那个方法(我认为表格会失去焦点),可以尝试使用EditTriggers. 例如:

table.setEditTriggers( QAbstractItemView::NoEditTriggers );

你的第一个方案可行,第二个不行。它失去焦点并不重要,因为我会显示一个模态对话框。如果没有更自然的解决方案被提出,我将把这个答案标记为正确的。 - Georg Schölly
我刚刚启动了一个示例来测试EditTriggers,它似乎可以工作(C ++,Qt 4.4.3)。我可以单击每个单元格等,但我无法双击它们进行编辑或任何其他操作。我不知道为什么它对你不起作用。 耸肩 - Nick Presta
这是关于关闭编辑器,而不是无法编辑它。下次双击它应该再次打开编辑器。 - Georg Schölly

1
在我的情况下,这些选项都没有正常工作。所以我想到:我需要将按键事件发送给行编辑本身。以下内容适用于 QTreeView,但可能适用于任何其他视图或小部件,以打开行编辑器来编辑单元格。
QWidget* editingWidget = treeView->findChild<QLineEdit*>();
if(editingWidget)
{
    QKeyEvent keyPressEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier);
    QApplication::sendEvent(editingWidget, &keyPressEvent);
    QApplication::processEvents(); // see note below
}

在我的情况下,当我完成一个项目的编辑后,我希望能直接开始编辑另一个字段。这就是为什么我在那里放置了processEvents,但在大多数情况下,您可能可以删除该行。
附注:是的,这是C++,但应该很容易适应Python。当我搜索C++解决方案时,我发现了这个线程,所以也许对其他人有所帮助。

1

你可以尝试使用QTableWidget.closePersistentEditor()来关闭编辑器。然而,QAbstractItemView.closeEditor()可能更接近你想要的,特别是因为你似乎已经熟悉基于QModelIndex的API并且已经在使用自定义编辑器小部件。


0

我不能代表列表小部件发言。但是,我在尝试做类似的事情时到达了这里。

我双击了一个单元格,根据列带出一个带有列表的子表单,然后当关闭该子表单时,根据所选值移动到下一个适当的列。

我的问题是我可以获取单元格中的值并“选择”下一个适当的单元格,但原始单元格仍处于编辑模式中!

最后我终于意识到我的双击选择了单元格,即正在编辑。

单击选择单元格但不会打开编辑模式。

附注:我从未能使该子表单真正模态,因此我在调用表单中创建了一个循环:当子表单可见时,唯一的代码是app.processEvents()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接