如何通过QTest来访问QMessageBox

4
我正在使用QTest创建一些自动化GUI测试。我可以使用以下命令访问应用程序中的小部件:
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");

它目前可以正常工作,但现在我需要点击一个QMessageBox的OK按钮。

我在我的应用程序中创建了QMessageBox,如下所示:

if( something_wrong )
{
    QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}

我该如何访问这个QMessageBox及其按钮?

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
我在以下链接找到了解决方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib。这个方案使用了命令QApplication::topLevelWidgets();获取控件列表。然后它会查找消息框控件并模拟按下回车键(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);
        }
    }
}

头文件必须包含Q_OBJECT宏才能使用信号和槽机制。 示例:

class MyClass: public QWidget
{
    Q_OBJECT
public:
    ...

当消息框出现时,UI(线程)被阻塞,这对我很有效。

注意:添加Q_OBJECT宏后,请记得重新构建项目。


2

通常可以参考Qt的自动测试:tst_qmessagebox.cpp

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;
    }
}
从那段代码来看,你可以通过QApplication::activeModalWidget()获取消息框。测试本地(我假设它们是本地)小部件很困难,这可能是为什么他们选择发送按键事件的原因,因为对于这些事件,你不需要知道按钮的位置,就像使用鼠标单击一样。

感谢@Mitch的努力。我在以下链接中找到了解决方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib。它使用QApplication::topLevelWidgets();,并且效果很好。再次感谢。 - KelvinS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,