QTableWidget信号cellChanged(): 区分用户输入和程序变更
我正在使用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)