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

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

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

table.currentIndex()

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

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

【问题讨论】:

    标签: qt pyqt


    【解决方案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++ 解决方案时发现了这个帖子,所以也许它也对其他人有帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-25
            • 1970-01-01
            • 1970-01-01
            • 2020-06-06
            • 1970-01-01
            • 1970-01-01
            • 2017-04-07
            • 2017-01-10
            相关资源
            最近更新 更多