Unit testing 测试QWidget是否接收鼠标输入

Unit testing 测试QWidget是否接收鼠标输入,unit-testing,pyqt5,Unit Testing,Pyqt5,我最近在我的PyQt5应用程序中引入了一个bug。我有一个QWidget,我在其中渲染一个游戏,我在QMainWindow中使用它作为中心widget,我称之为画布。我想在画布上呈现一些文本,所以我制作了下面的QWidget,现在我将它用作我的centralWidget。它在画布上堆叠一个QLabel class CentralWidget(PyQt5.QtWidgets.QWidget): def __init__(self, content: Canvas) -> None:

我最近在我的PyQt5应用程序中引入了一个bug。我有一个QWidget,我在其中渲染一个游戏,我在QMainWindow中使用它作为中心widget,我称之为画布。我想在画布上呈现一些文本,所以我制作了下面的QWidget,现在我将它用作我的centralWidget。它在画布上堆叠一个QLabel

class CentralWidget(PyQt5.QtWidgets.QWidget):
  def __init__(self, content: Canvas) -> None:
    super().__init__()
    self.content = content
    content.setParent(self)

    self.label = PyQt5.QtWidgets.QLabel('', self)
    self.label.setObjectName('notification_label')
    self.label.setStyleSheet("QLabel { color : white; font-size: 50px }")
    self.label.setAlignment(PyQt5.QtCore.Qt.AlignCenter)

  def resizeEvent(self, event: PyQt5.QtGui.QResizeEvent) -> None: # pylint: disable=invalid-name
    self.label.setGeometry(0, 0, event.size().width(), event.size().height())
    self.content.setGeometry(0, 0, event.size().width(), event.size().height())
这渲染得很好,但它导致我的画布停止接收鼠标输入。我意识到我的QLabel正在拦截所有输入,我通过添加
self.label.setAttribute(PyQt5.QtCore.Qt.WA_TransparentForMouseEvents)
解决了这个问题。我想我应该添加一个回归测试


我尝试使用QTest和QApplication将鼠标事件发送到QMainWindow,希望它们冒泡下来,但事件似乎从未经过QMainWindow。然后我尝试将事件发送到画布,我发现当我这样做时,它们会跳转到QMainWindow。我不想测试画布是否正确处理输入,我想测试输入事件是否被路由到画布。有没有办法在单元测试中验证这一点?

因为这些鼠标事件会冒泡而不是冒泡,我认为QT必须通过找到鼠标输入发生的最低QWidget,然后向其发送鼠标事件,这表明一个涉及QWidget::childAt和/或QApplication::widgetAt的解决方案来处理鼠标输入。果然,QWidget::childAt会忽略设置了WA_TransparentForMouseeEvents属性的小部件,所以我已经使用QWidget::childAt编写了一个测试


在为一般事件创建单元测试之前,我会检查小部件结构。你能提供一份实际的报告吗?