我在以下链接上找到了解决方案:http ://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib 。
它使用命令QApplication::topLevelWidgets();
来获取小部件列表。然后它搜索消息框小部件并模拟一个键 enter ( 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宏时重建项目。