【问题标题】:not displaying old value when editing cell in a QTableWidget在 QTableWidget 中编辑单元格时不显示旧值
【发布时间】:2017-01-16 04:53:22
【问题描述】:

我有一个基本的 QTableWidget,用这个 python 代码创建:

from silx.gui import qt
app = qt.QApplication([])
qtw = qt.QTableWidget()
qtw.show()
qtw.setColumnCount(8)
qtw.setRowCount(7)
app.exec_()

from silx.gui import qt 行只是一个包装器,它找出已安装的 qt 包装器(PyQt4、PyQt5 或 PySide)并展平 qt 命名空间。

当我编辑一个单元格时,生成的表格有一个奇怪的行为:正如预期的那样,当我双击单元格时,旧文本被高亮显示,但不寻常的行为是旧文本仍然可见,而新文本与旧的,而我正在输入它,直到我按 Enter 或单击另一个单元格。

我希望在我开始输入新文本后旧文本消失。我知道这是可能的,因为我有一个程序示例,它具有我想要的行为的 qTableWidget。

但我无法找到该程序中单元格编辑行为发生更改的位置。我该怎么做?

“垃圾邮件”和“鸡蛋”叠加的示例。

[

编辑:没有包装业务的代码示例

from PyQt5.Qt import QApplication, QTableWidget, qVersion
app =QApplication([])
print(qVersion())
qtw = QTableWidget()
qtw.show()
qtw.setColumnCount(8)
qtw.setRowCount(7)
app.exec_()

对于 PyQt4,使用此导入(同时删除 print(qVersion()) 行):

from PyQt4.QtGui import QApplication, QTableWidget

【问题讨论】:

  • 您是否像往常一样在导入 qt 包装器后尝试了您的代码。导入 PyQt5 后,它按预期工作。
  • 我试过了,我没有解决问题。我测试了 PyQt4/Qt 4.8.6 和 PyQt5/Qt 5.3.2。
  • @PiRK。我无法使用 PyQt-4.11.4/Qt-4.8.7 或 PyQt-5.7/Qt-5.7 重现这一点。对我来说它看起来像一个错误。您是否能够通过查看 Qt Designer 中的类似示例来重现该问题?也许你也应该尝试一些不同风格的插件。
  • 我在 Qt 设计器中使用 qtablewidget 时遇到了同样的问题。
  • 有趣的发现:我玩过另一个具有正确行为的程序。当从该复杂程序调用小部件时,单元格的行为方式将按照我们希望的方式进行。但是当我自己加载小部件时,我遇到了与我的示例相同的问题。

标签: python qt pyqt qtablewidget


【解决方案1】:

我的方法:

class MyDelegate(QItemDelegate):

    def setEditorData(self,editor,index):
        editor.setAutoFillBackground(True)
        editor.setText(index.data().toString())

【讨论】:

    【解决方案2】:

    通常,编辑行为通过QItemDelegates 控制。通常,这样做是为了提供更高级的编辑,或在进行编辑时过滤输入数据或执行一些副作用(如更新数据库)。但是您也可以使用它来清除编辑时呈现给用户的编辑器。

    class MyDelegate(QItemDelegate):
    
        def setEditorData(self, editor, index):
            # Normally, this would set the text of the editor to the current
            # value of the cell.  If you do nothing here, it will be blank.
            editor.clear()
    
    qtw = QTableWidget()
    delegate = MyDelegate(qtw)
    qtw.setItemDelegate(delegate)
    

    【讨论】:

    • 感谢您提供的信息。不幸的是,这似乎并没有改变我的桌子的行为。
    【解决方案3】:

    就我而言,当我将 QWidgetTable 的背景颜色设置为透明时,就会出现上述问题。当我删除设置时,不再有旧数据覆盖新数据。 希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      您可以尝试将 QTableWidget cellClicked(int row, int column) 发出的信号与为清除条目创建的插槽连接。
      http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html#connecting-disconnecting-and-emitting-signals

      【讨论】:

      • 每次我尝试选择它时不会删除我的数据(例如复制值)吗?
      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多