【问题标题】:How can I get access to a QMessageBox by QTest如何通过 QTest 访问 QMessageBox
【发布时间】:2016-11-30 12:13:31
【问题描述】:

我正在使用 QTest 在我的应用程序中创建一些自动化的GUI 测试

我可以使用以下命令从我的应用程序中访问小部件:

savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");

它工作正常,但现在我必须点击 QMessageBox 的 OK 按钮。

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

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

我怎样才能访问这个 QMessageBox 及其按钮?

【问题讨论】:

    标签: qt qwidget qmessagebox qtestlib


    【解决方案1】:

    查看Qt's auto tests 通常会有所帮助:

    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() 获取消息框。测试本机(我假设它们是本机的)小部件很困难,这可能是他们选择发送关键事件的原因,因为您不需要知道例如这些按钮的位置,就像您单击鼠标一样。

    【讨论】:

    【解决方案2】:

    我在以下链接上找到了解决方案: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宏时重建项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-02-17
      • 2021-03-05
      • 2021-07-25
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多