如何使用QTest在PyQt5中发送Ctrl键组合?

时间:2018-02-05 11:41:22

标签: python unit-testing pyqt pyqt5 qtestlib

我使用PyQt5.6,Python 3.5和Windows进行业余爱好项目,其中我有一个应用程序,其中包含一些设置了快捷方式的操作(QAction)(用于组合Ctrl-N和{{1} }, 例如)。我已经编写了单元测试来验证是否可以触发这些操作,并且他们会按照自己的意愿行事。

但是,我无法找到任何使用在使用Ctrl-B编写单元测试时设置的快捷方式触发操作的实例。

为了支持这个问题,这是最小的应用程序代码:

QTest

该应用有一个可由import sys from PyQt5 import QtGui, QtCore from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QLabel ######################################################################## class Window(QMainWindow): def __init__(self): super(Window, self).__init__() self.setGeometry(50, 50, 500, 300) action1 = QAction("&Action1", self) action1.setShortcut("Ctrl+U") action1.triggered.connect(self.update_label) self.label = QLabel('Empty', self) self.setCentralWidget(self.label) main_menu = self.menuBar() file_menu = main_menu.addMenu("&File") file_menu.addAction(action1) self.show() def update_label(self): print("updating label") self.label.setText('Updated label') if __name__ == '__main__': app = QApplication(sys.argv) GUI = Window() sys.exit(app.exec_()) 触发的操作。该应用程序按预期工作。现在我已经编写了一个单元测试套件:

Ctrl-U

执行测试import unittest from PyQt5.QtWidgets import QApplication from PyQt5.Qt import QKeySequence from PyQt5.Qt import Qt from myapp import Window from PyQt5.QtTest import QTest ######################################################################## class Test(unittest.TestCase): #---------------------------------------------------------------------- def setUp(self): self.app = QApplication([]) self.ui = Window() self.menu = self.ui.menuBar() #---------------------------------------------------------------------- def test_update_label_from_menu(self): self.assertEqual(self.ui.label.text(), 'Empty') self.menu.actions()[0].menu().actions()[0].trigger() self.assertEqual(self.ui.label.text(), 'Updated label') #---------------------------------------------------------------------- def test_update_label_from_shortcut(self): self.assertEqual(self.ui.label.text(), 'Empty') QTest.keyClicks(self.ui, 'U', Qt.ControlModifier) print(self.ui.label.text()) QTest.keyPress(self.ui, 'U', Qt.ControlModifier) print(self.ui.label.text()) QTest.keyPress(self.ui, Qt.Key_U, Qt.ControlModifier) print(self.ui.label.text()) self.assertEqual(self.ui.label.text(), 'Updated label') return #---------------------------------------------------------------------- def tearDown(self): pass 时,操作将被触发,我可以看到标签文本已更新且测试通过。但是,我无法使用test_update_label_from_menu测试中的QTest正确发送快捷方式(我正在尝试各种组合)。测试失败。

如何使用test_update_label_from_shortcut

发送事件,例如按Ctrl-N

更新 看起来我已经在this answer(调用QTest)中使用了建议的方式,但这对我不起作用。不确定这是否重要,但答案是指PySide,但我在使用PyQt。

更新2 :为了能够通过测试,我必须在QTest.keyClicks(self.window, 'n', Qt.ControlModifier)中添加QTest.qWaitForWindowExposed(self.ui)行。然后可以使用快捷方式发送按键。

0 个答案:

没有答案