如何告诉 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 结束编辑单元格?的主要内容,如果未能解决你的问题,请参考以下文章