0

使用 pycharm,我用 pyqt5 创建了一个小 gui,并想用 pytest 和 qtbot 进行测试。

我在单击菜单中的 menu_entry 时遇到问题,我可能需要提示。

我看了这篇很有帮助的帖子: `pytestqt.mouseMove` to menubar menu widget move to wrong place in the comments他们谈到了在菜单栏中单击一个条目的问题。(gist.github.com/eyllanesc/ded349044bf43dd79f8c43acb049b263)但是解决方案代码不再可用。

menu 
`-> menu_entry1
`-> menu_entry2

目前测试代码如下所示:

def test_menubar_click(app, qtbot) -> None:
    app.show()
    file_menu = app.ui.menuECIES
    menubar = app.ui.menubar
    qtbot.add_widget(menubar)

    action_rect = menubar.actionGeometry(file_menu.menuAction())
    qtbot.wait(1000)
    qtbot.mouseMove(menubar, action_rect.center())
    qtbot.wait(1000)
    qtbot.mouseClick(menubar, QtCore.Qt.LeftButton, pos=action_rect.center())
    qtbot.wait(1000)
    qtbot.mouseMove(file_menu, action_rect.center())
    qtbot.wait(1000)
    qtbot.mouseClick(file_menu, QtCore.Qt.LeftButton)
    qtbot.wait(1000)

为最小的、可重现的示例添加了代码:

主文件

import sys

from qtpy import QtWidgets

from ui.mainwindow import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowTitle("Test Tool by TTM - v0.1")

        self.shortcut_exit = QtWidgets.QShortcut("Alt+Q", self)
        self.shortcut_exit.activated.connect(self.close)
        self.ui.actionGenerate_new.triggered.connect(self.print_message)

    def print_message(self):
        print("Menu generate new clicked")
# Hauptprogramm

def main_GUI():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    return app, window

if __name__ == "__main__":
    app, window = main_GUI()
    rc = app.exec_()
    print("App end is exit code {}".format(rc))
    sys.exit(rc)

用户界面/主窗口.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui/mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.12.3
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
        self.menubar.setObjectName("menubar")
        self.menuECIES = QtWidgets.QMenu(self.menubar)
        self.menuECIES.setObjectName("menuECIES")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionGenerate_new = QtWidgets.QAction(MainWindow)
        self.actionGenerate_new.setObjectName("actionGenerate_new")
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.menuECIES.addAction(self.actionGenerate_new)
        self.menuECIES.addSeparator()
        self.menuECIES.addAction(self.actionExit)
        self.menubar.addAction(self.menuECIES.menuAction())

        self.retranslateUi(MainWindow)
        self.actionExit.triggered.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuECIES.setTitle(_translate("MainWindow", "ECIE&S"))
        self.actionGenerate_new.setText(_translate("MainWindow", "Generate new"))
        self.actionExit.setText(_translate("MainWindow", "E&xit!"))

test_main.py

import os
import sys

import pytest
from PyQt5 import QtCore, QtGui, QtTest, QtWidgets
from pytestqt.plugin import QtBot

from main import MainWindow

@pytest.fixture
def app(qtbot):
    window = MainWindow()
    qtbot.addWidget(window)
    return window

def test_menubar_click(app, qtbot) -> None:
    # Arrange
    app.show()
    file_menu = app.ui.menuECIES
    menubar = app.ui.menubar
    qtbot.add_widget(menubar)
    # Act
    action_rect = menubar.actionGeometry(file_menu.menuAction())
    qtbot.wait(1000)
    qtbot.mouseMove(menubar, action_rect.center())
    qtbot.wait(1000)
    qtbot.mouseClick(menubar, QtCore.Qt.LeftButton, pos=action_rect.center())
    qtbot.wait(1000)
    qtbot.mouseMove(file_menu, action_rect.center())
    qtbot.wait(1000)

4

0 回答 0