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

时间:2009-02-05 23:20:56

标签: qt pyqt

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

现在Qt拥有所有那些不错的API调用,例如QTableWidget.edit()QTableWidget.editItem(),我真正想要的是QTableWidget.endEditing(),最好不要指定单元格的索引,不过我可以通过这个电话得到它:

table.currentIndex()

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

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

Popup menu

5 个答案:

答案 0 :(得分:7)

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

我会尝试:

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

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

table.setEditTriggers( QAbstractItemView::NoEditTriggers );

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分: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++ 解决方案时发现了这个线程,所以也许它对其他人也有帮助。

答案 4 :(得分:0)

我无法代表列表小工具。但是,我来到这里试图做类似的事情。

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

我的问题是我可以在单元格中获取值,然后选择&#34;下一个合适的单元格,但原始单元格在编辑模式下保持选中状态!

我终于明白我的双击选择了细胞,即。编辑。

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

旁注:永远不能让该子表单行为真正的模态,所以我在调用表单中创建了一个循环:子表单是可见的,唯一的代码是app.processEvents()