检查是否存在QMessageBox并将其关闭

Check for a QMessageBox and close it

本文关键字:是否 存在 QMessageBox 检查      更新时间:2023-10-16

我需要使用qtest(在eclipse中)在c++qt中自动化gui测试我给出了一个函数,可以将一些选项卡添加到选项卡小部件中(最多9个),如果您尝试打开第10个选项卡,则会出现一个QMessageBox:

QMessageBox::critical(this, "MAX9",
tr("Only a maximum of 9 tabs can be opened.n"));

因为带有"添加选项卡"功能的整个菜单和所有内容都是私有的,所以我不得不使用插槽和来自测试类的信号来访问该方法。

现在我的问题是,有没有一种方法可以检查是否有任何QMessageBox打开,如果是,则自动关闭它们?

编辑:已解决我将vahancho的解决方案放入一个方法(CloseMessageBoxes)中,并在我的测试方法中创建了一个计时器,该计时器调用CloseMessageBoxers()方法,然后:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(CloseMessageBoxes()));
timer->start(5000);

出现了多个消息框,但所有消息框都在5秒钟后自动关闭。

我认为,你可以找到所有的消息框,因为它们是顶级的小部件,并逐一关闭它们:

QWidgetList topWidgets = QApplication::topLevelWidgets();
foreach (QWidget *w, topWidgets) {
    if (QMessageBox *mb = qobject_cast<QMessageBox *>(w)) {            
        QTest::keyClick(mb, Qt::Key_Enter);
    }
}

然而,问题是消息框是一个模态对话框,它阻塞了主事件循环。在出现消息框后,您需要找到一种方法来执行上面的代码。