5

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

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

table.currentIndex()

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

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

弹出菜单

4

5 回答 5

7

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

我会尝试:

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

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

table.setEditTriggers( QAbstractItemView::NoEditTriggers );
于 2009-02-05T23:29:51.587 回答
6

table.setCurrentItem(None)对我有用。(如果您使用某些 cellChanged/itemChanged 插槽函数,请不要忘记阻止信号。)

这与 PyQt 相关。对于 C++,我认为将 None 替换为 NULL。

于 2015-07-20T19:01:49.737 回答
1

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

于 2009-02-23T01:05:50.933 回答
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那里的原因,在大多数情况下,您可能可以删除该行。

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

于 2021-01-17T09:18:26.573 回答
0

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

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

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

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

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

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

于 2015-11-25T20:13:16.433 回答