我正在显示一个弹出菜单,用于在QTableWidget中选择一些值。最低项是“修改列表”条目,当我选择它时,应自动出现一个新窗口,QComboBox应该消失,单元格返回Qt :: DisplayRole状态。
现在Qt拥有所有那些不错的API调用,例如QTableWidget.edit()
和QTableWidget.editItem()
,我真正想要的是QTableWidget.endEditing()
,最好不要指定单元格的索引,不过我可以通过这个电话得到它:
table.currentIndex()
...但我不知道我是否可以保证当前的单元格始终是正在编辑的单元格。
是否有关闭这类编辑器的API?
答案 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()