我有一个用4列填充的python QTableWidget。选择任何列都会运行qTableWidget.cellClicked()信号,然后突出显示整个行,并运行一堆代码。
self._qTableWidget.cellClicked.connect(self.cellClicked)
def cellClicked(self, row, column):
"""
Handle cell clicked signal.
"""
self._qTableWidget.setDisabled(True)
qTableWidgetItem = self._qTableWidget.item(row, column)
if qTableWidgetItem is None:
return
else:
# ***RUNS SOME CODE***
pass
self._qTableWidget.setEnabled(True)
在代码中,我希望在代码运行之前禁止QTableWidget接受任何单击,然后启用QTableWidget (通过使用setDisabled()/setEnabled())。
但是,如果单击单元格,表将被正确禁用,但仍可以单击表中的单元格。当表再次启用时,它会再次在禁用表时单击的QTableWidgetItem上运行QTableWidgetItem()信号。
我曾尝试使用以下方法:
self._qTableWidget.blockSignals(True)
self._qTableWidget.blockSignals(False)
self._qTableWidget.cellClicked.disconnect(self.cellClicked)
self._qTableWidget.cellClicked.connect(self.cellClicked)
self.setAllCellItemFlags(QtCore.Qt.NoItemFlags)
def setAllCellItemFlags(self, flag):
"""
Sets all QTableWidgetItem flags
"""
for row in range(self._qTableWidget.rowCount()):
for column in range(self._qTableWidget.columnCount()):
qTableWidgetItem = self._qTableWidget.item(row, column)
qTableWidgetItem.setFlags(flag)
发布于 2022-01-26 18:29:30
这可能发生在您的代码中:
thread
如您所见,在信号重新启用后,第二次单击将被处理.这是你问题的根源。您需要做的是在事件循环处理等待的鼠标单击(或鼠标单击)后重新启用信号。
最简单的解决方案是在重新启用信号之前调用QApplication.processEvents(QEventLoop.AllEvents, 0)
。这将导致处理所有单击事件,即忽略,因为此时信号仍将被禁用。请阅读有关此方法过载的文档,该方法中的进程也发布了(尚未排队)事件。与没有ms
参数的其他重载相反,后者只处理已经排队的事件。如果值0
是不够的,那么尝试更长的时间延迟,例如100 ms。
https://stackoverflow.com/questions/70867608
复制相似问题