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

Posted

技术标签:

【中文标题】如何告诉 QTableWidget 结束编辑单元格?【英文标题】:How can I tell a QTableWidget to end editing a cell? 【发布时间】:2010-10-05 19:54:48 【问题描述】:

我正在显示一个弹出菜单来选择 QTableWidget 中的一些值。最低的项目是“修改列表”条目,当我选择它时,应该会自动出现一个新窗口,并且 QComboBox 应该消失并且单元格返回到 Qt::DisplayRole 状态。

现在 Qt 拥有所有不错的 API 调用,例如 QTableWidget.edit()QTableWidget.editItem(),我真正想要的是 QTableWidget.endEditing(),最好不指定单元格的索引,尽管我可以使用它来获得它调用:

table.currentIndex()

……但我不知道我是否可以保证当前单元格是一直被编辑的单元格。

是否有 API 可以关闭这类编辑器?

【问题讨论】:

【参考方案1】:

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

我会尝试:

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

虽然你说它对你不起作用,但还有另一种方法: 如果您不喜欢这样(我相信表格失去焦点),您可以尝试使用EditTriggers。例如:

table.setEditTriggers( QAbstractItemView::NoEditTriggers );

【讨论】:

您的第一个有效,第二个无效。它失去焦点并不重要,因为我显示了一个模态对话框。如果没有人会提出更自然的解决方案,我会将此答案标记为正确。 我刚刚启动了一个示例来测试 EditTriggers,它似乎可以工作(C++,Qt 4.4.3)。我可以单击每个单元格等,但我无法双击它们进行编辑或任何内容。我不知道为什么它对你不起作用。 耸耸肩 关闭编辑器,不能编辑。下一次双击它应该再次打开编辑器。【参考方案2】:

您可以使用 QTableWidget.closePersistentEditor() 来关闭编辑器。但是,QAbstractItemView.closeEditor() 可能更接近您想要的,特别是因为您似乎对基于 QModelIndex 的 API 感到满意并且已经在使用自定义编辑器小部件。

【讨论】:

【参考方案3】:

table.setCurrentItem(None) 对我有用。 (如果你使用一些 cellChanged/itemChanged 槽函数,不要忘记阻塞信号。)

这是 PyQt 的。对于 C++,我认为将 None 替换为 NULL。

【讨论】:

【参考方案4】:

我不能说列表小部件。但是,我来到这里试图做类似的事情。

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

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

我终于意识到我的双击是选择单元格,即。编辑。

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

旁注:永远无法让该子表单真正发挥模态作用,因此我在调用表单中创建了一个循环:当子表单可见时,唯一的代码是 app.processEvents()

【讨论】:

【参考方案5】:

就我而言,没有一个选项能正常工作。所以,我想:我需要将按键事件发送到行编辑本身。以下内容适用于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 放在那里的原因,在大多数情况下,您可能可以删除该行。

PS:是的,它是 C++,但应该很容易适应 Python。我在搜索 C++ 解决方案时发现了这个帖子,所以也许它也对其他人有帮助。

【讨论】:

以上是关于如何告诉 QTableWidget 结束编辑单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断QTableWidget中的单元格是处于选中状态还是正在编辑的状态(即光标进入)?如下图:

QTableWidget:检测单元格编辑开始的信号

QTableWidget中如何动态分配单元格

QT QTableWidget设置单元格不可编辑

QTableWidget:用于检测单元格编辑开始的信号

如何将文本与 QTableWidget 中的单元格中心对齐