Skip to content

BUG: Click Away from MenuBar does not Close MenuBar #430

@adam-grant-hendry

Description

@adam-grant-hendry

System

OS: Windows 10
Python: 3.8.10
Qt: PySide6
pytest-qt: 4.0.2

Problem

After clicking a QMenuBar item, clicking away from the menu does not close it when using qtbot.

MRE

myproj/main.py

from qtpy import QtWidgets


class View(QtWidgets.QMainWindow):
    """The main window."""

    def __init__(self):
        super().__init__()
        self.container = QtWidgets.QFrame()

        self.layout_ = QtWidgets.QVBoxLayout()
        self.layout_.setSpacing(0)
        self.layout_.setContentsMargins(0, 0, 0, 0)

        self.container.setLayout(self.layout_)
        self.setCentralWidget(self.container)

        self._create_actions()
        self._create_menubar()

    def _create_actions(self):
        self.new_action = QtWidgets.QAction(
            '&New Project...',
            self,
        )

    def _create_menubar(self) -> None:
        self.menubar = self.menuBar()
        self.file_menu = self.menubar.addMenu('&File')
        self.file_menu.addAction(self.new_action)

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = View()
    window.showMaximized()
    app.exec_()

tests/test_window.py

import pytest
from myproj.main import View
from pytestqt.qtbot import QtBot
from qtpy import QtCore


@pytest.fixture(name='window', scope='function')
def fixture_app(qtbot):
    window = View()
    window.setMouseTracking(True)
    window.showMaximized()

    yield window


def test_click_outside_menu_closes_menu(window: 'View', qtbot: 'QtBot') -> None:
    """Tests that menu closes when user clicks away from it.

    Args:
        window (view): (fixture) Qt application main window
    """
    menubar = window.menubar
    file_menu = window.file_menu
    new_action = window.new_action

    file_rect = menubar.actionGeometry(file_menu.menuAction())
    new_rect = file_menu.actionGeometry(new_action)

    pause = 1000  # milliseconds

    # Assert - Precondition
    assert not file_menu.isVisible()

    # # Act - Menubar
    qtbot.wait(pause)
    qtbot.mouseMove(menubar, file_rect.center())
    qtbot.wait(pause)
    qtbot.mouseClick(menubar, QtCore.Qt.LeftButton, pos=file_rect.center())
    qtbot.wait(pause)
    qtbot.mouseMove(file_menu, new_rect.center())
    qtbot.wait(pause)
    qtbot.mouseMove(window, window.rect().center())
    qtbot.wait(pause)
    qtbot.mouseClick(window, QtCore.Qt.LeftButton, pos=window.rect().center())
    qtbot.wait(pause)

    # Assert - Precondition
    assert not file_menu.isVisible()

Result

qtbug-104075

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions