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

5
我正在使用PyQt,但我的问题是一个通用的Qt问题:
我有一个QTableWidget,由函数updateTable设置。当它被调用时,它会将DATASET中的数据写入表格。不幸的是,这会导致我的QTableWidget为每个单元格发出信号cellChanged()。
信号cellChanged()连接到一个函数on_tableWidget_cellChanged,该函数读取更改单元格的内容,并将其写回DATASET。这是必要的,以允许用户手动更改数据。
因此,每次更新表格时,它的内容都会被写回DATASET。
有没有办法区分单元格是由用户还是由updateTable更改的?
我想暂时通过updateTable断开on_tableWidget_cellChanged,但这似乎有点不好。
3个回答

8

在类似的情况下,我只是使用了以下方法:

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

在设置表之前阻塞信号,然后解除阻塞:
myTable.blockSignals(True)
#blah-blah..
myTable.blockSignals(False)

1

看起来,至少在4.6版本中,这是QTableWidget中唯一的信号。你可以发布一个功能请求,但我不知道它是否被接受,你可能需要等很长时间才能得到回应 ;-)

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

无论如何,在更新单元格的时间断开连接并不那么糟糕,因为你不能连接到特定的信号。


1
我建议您将QTableWidget更改为带有适当模型的QTableView。从您所说的情况来看,您已经有一个数据库或其他数据对象来保存和排列数据,因此这应该相对容易做到。然后,这将允许您区分编辑(在您的模型上调用setData)和更新(在您的模型上调用data)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接