使用 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)