2016-07-26 100 views
1

我正在使用QTest在我的应用程序中创建一些自动化的GUI测试如何通过QTest访问QMessageBox

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

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

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

我创建了QMessageBox提示在我的应用程序是这样的:

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

我怎样才能访问这个QMessageBox提示,和它的按钮?

回答

1

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

2

它常常有助于看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()得到的消息框。原生测试(我假设它们是本地的)小部件很困难,这可能是他们选择发送关键事件的原因,因为您不需要知道这些按钮的位置,就像你用鼠标点击一样。

+0

感谢@Mitch为您付出的努力。我在以下链接上找到了解决方案:[http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib](http://www.qtcentre.org/threads/31239-Testing -modal-dialogs-with-QTestLib)。它使用'QApplication :: topLevelWidgets();'并且运行良好。再次感谢。 – KelvinS