【问题标题】:QTableWidget signal cellChanged(): distinguish between user input and change by routinesQTableWidget信号cellChanged():区分用户输入和例程改变
【发布时间】:2011-01-26 18:33:32
【问题描述】:

我正在使用 PyQt,但我的问题是一般的 Qt 问题:

我有一个由函数 updateTable 设置的 QTableWidget。它在调用时将数据从 DATASET 写入表。不幸的是,这会导致我的 QTableWidget 为每个单元格发出信号 cellChanged()。

信号 cellChanged() 连接到函数 on_tableWidget_cellChanged,该函数读取已更改单元格的内容并将其写回 DATASET。这是允许用户手动更改数据所必需的。

所以每次更新表时,都会将其内容写回 DATASET。

有没有办法区分单元格是由用户更改还是由 updateTable 更改的?

我想过通过 updateTable 暂时断开 on_tableWidget_cellChanged 的​​连接,但这似乎有点脏。

【问题讨论】:

    标签: python qt pyqt signals qtablewidget


    【解决方案1】:

    类似的情况我刚刚用过

    bool QObject::blockSignals ( bool block )
    bool QObject::signalsBlocked () const
    

    在建表前屏蔽信号,然后解除屏蔽:

    myTable.blockSignals(True)
    #blah-blah..
    myTable.blockSignals(False)
    

    【讨论】:

      【解决方案2】:

      看来,至少对于 4.6,这是 QTableWidget 中的唯一信号。您可以发布功能请求,但我不知道它是否被接受,您可能会等待很长时间;-)

      也许您可以尝试编写 QTableWidget 的子类并在内部更改单元格时发出自己的信号。

      无论如何,在更新单元格时断开连接并没有那么糟糕,因为您无法连接到特定信号。

      【讨论】:

        【解决方案3】:

        我建议使用合适的型号将 QTableWidget 更改为 QTableView。从它的声音来看,你有一个数据库或其他数据对象来保存和排列数据,所以希望它很容易做到。这将允许您区分编辑(在您的模型上调用setData)和更新(在您的模型上调用data)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多