首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过QMessageBox访问QTest

如何通过QMessageBox访问QTest
EN

Stack Overflow用户
提问于 2016-07-26 17:55:28
回答 2查看 1.9K关注 0票数 4

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

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

代码语言:javascript
复制
savePushButton = mainWindow->findChild<QPushButton *>("savePushButton");

它运行得很好,但是现在我必须单击QMessageBox的OK按钮。

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

代码语言:javascript
复制
if( something_wrong )
{
    QMessageBox::warning(new Widget(), "Title", "Something wrong!");
}

我如何才能访问这个QMessageBox,及其按钮?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-02 22:35:42

我在以下链接上找到了一个解决方案:http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib

它使用命令QApplication::topLevelWidgets();获取一个小部件列表。然后搜索消息框小部件,并模拟关闭消息框的键enter (QTest::keyClick(mb, Qt::Key_Enter);)。

示例:

代码语言:javascript
复制
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宏才能使用信号和插槽机制。示例:

代码语言:javascript
复制
class MyClass: public QWidget
{
    Q_OBJECT
public:
    ...

因为当消息框出现时,UI (线程)会被阻塞,所以对我来说效果很好。

注意事项:当您添加Q_OBJECT宏时,请记住重新构建项目。

票数 5
EN

Stack Overflow用户

发布于 2016-07-26 18:16:31

查找Qt自动测试通常会有所帮助

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38596785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档