QTableWidget信号cellChanged(): 区分用户输入和程序变更

5 投票
3 回答
6758 浏览
提问于 2025-04-15 20:20

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

我有一个QTableWidget,它是通过一个叫updateTable的函数来设置的。当这个函数被调用时,它会把DATASET中的数据写入到表格中。不幸的是,这样做会导致我的QTableWidget为每一个单元格发出cellChanged()信号。

这个cellChanged()信号连接了一个叫on_tableWidget_cellChanged的函数,这个函数会读取被更改的单元格的内容,并把它写回到DATASET。这是必要的,因为用户需要手动修改数据。

所以每次表格更新时,表格的内容都会被写回到DATASET。

有没有办法区分单元格是被用户更改的,还是被updateTable函数更改的呢?

我想过在updateTable执行时暂时断开on_tableWidget_cellChanged的连接,但这样做感觉有点不太干净。

3 个回答

1

我建议你把 QTableWidget 换成 QTableView,并使用合适的数据模型。听起来你已经有一个数据库或者其他数据对象在存储和整理数据,所以这样做应该比较简单。这样一来,你就可以区分编辑操作(在你的模型上调用 setData)和更新操作(在你的模型上调用 data)。

1

看起来,在QTableWidget中,至少在4.6版本里,这个信号是唯一的。你可以提出一个功能请求,但我不知道这个请求是否会被接受,而且你可能要等很久才能得到回复;-)

也许你可以尝试写一个QTableWidget的子类,然后在单元格内部发生变化时发出自己的信号。

总之,在更新单元格的时候断开连接也不是太糟糕,因为你无法连接到特定的信号。

8

在类似的情况下,我通常会这样做:

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

在设置表格之前先屏蔽信号,然后再解除屏蔽:

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

撰写回答