【问题标题】:Check for a QMessageBox and close it检查 QMessageBox 并关闭它
【发布时间】:2014-05-29 09:29:32
【问题描述】:

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

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

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

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

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

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

出现了多个消息框,但都在 5 秒后自行关闭。

【问题讨论】:

  • 天哪,我需要 Python 中的这个答案
  • @FoggyMindedGreenhorn 您能否针对 Python 版本提出一个不同的问题并分享链接?我有一个可能有帮助的答案,我不想用那个答案来淡化这个问题。

标签: c++ qt qmessagebox


【解决方案1】:

我认为,您可以找到所有消息框,因为它们是顶级小部件,然后将它们一一关闭:

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

但问题是消息框是一个模式对话框,它阻塞了主事件循环。出现消息框后,你需要想办法执行上面的代码。

【讨论】:

  • 是的,这就是我要求自动关闭它们的原因,我只有一个测试类,我看不到执行此操作的方法
  • @RandomDisplayName,如果您使用计时器会在一定时间后关闭所有消息框怎么办?
  • 我真的不知道我是怎么做到的:S 我的意思是当我第一次在我的方法中设置一个计时器然后出现消息框时,计时器会冻结不是吗?
  • @RandomDisplayName,是什么阻止您尝试它?只需在您的 gui 线程中启动一个计时器,然后在显示消息框时查看它是否超时。
猜你喜欢
  • 2014-12-25
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2015-01-11
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多