如何通过QTest访问QMessageBox
我正在使用QTest在我的应用程序中创建一些自动化的GUI测试 我可以使用以下命令从我的应用程序访问小部件:如何通过QTest访问QMessageBox,qt,qwidget,qmessagebox,qtestlib,Qt,Qwidget,Qmessagebox,Qtestlib,我正在使用QTest在我的应用程序中创建一些自动化的GUI测试 我可以使用以下命令从我的应用程序访问小部件: savePushButton = mainWindow->findChild<QPushButton *>("savePushButton"); 如何访问此QMessageBox及其按钮?查看以下内容通常会有所帮助: 根据代码判断,你可以通过。测试本机(我假设它们是本机)小部件很困难,这可能是它们选择发送关键事件的原因,因为您不需要知道这些小部件的按钮位置,就像您单击
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");
如何访问此QMessageBox及其按钮?查看以下内容通常会有所帮助:
根据代码判断,你可以通过。测试本机(我假设它们是本机)小部件很困难,这可能是它们选择发送关键事件的原因,因为您不需要知道这些小部件的按钮位置,就像您单击鼠标一样。我在以下链接上找到了解决方案: 它使用命令
QApplication::topLevelWidgets()
以获取小部件列表。然后,它搜索MessageBox小部件并模拟一个按键输入(QTest::keyClick(mb,Qt::key_enter);
)关闭消息框
例如:
void MyTest::testDialog()
{
QTimer::singleShot(500, this, SLOT(timeOut()));
QVERIFY(functionThatProducesMessageBox());
}
void MyTest::timeOut()
{
QWidgetList allToplevelWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, allToplevelWidgets) {
if (w->inherits("QMessageBox")) {
QMessageBox *mb = qobject_cast<QMessageBox *>(w);
QTest::keyClick(mb, Qt::Key_Enter);
}
}
}
这对我来说很好,因为当消息框出现时UI(线程)被阻塞
注意:请记住在添加Q_对象宏时重建项目。感谢@Mitch的努力。我在以下链接上找到了解决方案:。它使用
QApplication::topLevelWidgets()代码>并且工作得很好。再次感谢。
void ExecCloseHelper::timerEvent(QTimerEvent *te)
{
if (te->timerId() != m_timerId)
return;
QWidget *modalWidget = QApplication::activeModalWidget();
if (!m_testCandidate && modalWidget)
m_testCandidate = modalWidget;
if (m_testCandidate && m_testCandidate == modalWidget) {
if (m_key == CloseWindow) {
m_testCandidate->close();
} else {
QKeyEvent *ke = new QKeyEvent(QEvent::KeyPress, m_key, Qt::NoModifier);
QCoreApplication::postEvent(m_testCandidate, ke);
}
m_testCandidate = Q_NULLPTR;
killTimer(m_timerId);
m_timerId = m_key = 0;
}
}
void MyTest::testDialog()
{
QTimer::singleShot(500, this, SLOT(timeOut()));
QVERIFY(functionThatProducesMessageBox());
}
void MyTest::timeOut()
{
QWidgetList allToplevelWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, allToplevelWidgets) {
if (w->inherits("QMessageBox")) {
QMessageBox *mb = qobject_cast<QMessageBox *>(w);
QTest::keyClick(mb, Qt::Key_Enter);
}
}
}
class MyClass: public QWidget
{
Q_OBJECT
public:
...