首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在禁用表后阻止QTableWidget信号?

如何在禁用表后阻止QTableWidget信号?
EN

Stack Overflow用户
提问于 2022-01-26 17:19:57
回答 1查看 317关注 0票数 0

我有一个用4列填充的python QTableWidget。选择任何列都会运行qTableWidget.cellClicked()信号,然后突出显示整个行,并运行一堆代码。

代码语言:javascript
运行
复制
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()信号。

我曾尝试使用以下方法:

代码语言:javascript
运行
复制
self._qTableWidget.blockSignals(True)
self._qTableWidget.blockSignals(False)
代码语言:javascript
运行
复制
self._qTableWidget.cellClicked.disconnect(self.cellClicked)
self._qTableWidget.cellClicked.connect(self.cellClicked)
代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-26 18:29:30

这可能发生在您的代码中:

thread

  • meanwhile
  1. 第一次单击到达,它在禁用(或断开连接)连接的插槽中发出信号
  2. ,指示启动代码,在运行代码时,它会阻塞主
  3. 中的事件循环,另一次鼠标单击会出现,它创建鼠标单击事件,但它被放置在等待等待事件循环能够处理它的
  4. 之后,您的冗长代码被完成,您重新启用(或重新连接)信号
  5. 事件循环被解除阻塞并处理等待的鼠标事件
  6. 作为对单击事件的响应--另一个信号被发出,连接的插槽再次运行,即步骤2.

如您所见,在信号重新启用后,第二次单击将被处理.这是你问题的根源。您需要做的是在事件循环处理等待的鼠标单击(或鼠标单击)后重新启用信号。

最简单的解决方案是在重新启用信号之前调用QApplication.processEvents(QEventLoop.AllEvents, 0)。这将导致处理所有单击事件,即忽略,因为此时信号仍将被禁用。请阅读有关此方法过载的文档,该方法中的进程也发布了(尚未排队)事件。与没有ms参数的其他重载相反,后者只处理已经排队的事件。如果值0是不够的,那么尝试更长的时间延迟,例如100 ms。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70867608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档