2016-07-26 1 views
1

Я создаю несколько автоматических тестов GUI в моей заявке, используя QTest.Как я могу получить доступ к QMessageBox от QTest

я могу получить доступ к виджетам из моего приложения с помощью команды:

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

Это работает отлично, но теперь я должен нажать на кнопке ОК в QMessageBox.

Я создал 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(). Тестирование native (я предполагаю, что они являются родными) виджетов затруднительно, поэтому вполне вероятно, что они решили отправлять ключевые события, так как вам не нужно знать, например. расположение кнопок для них, как и при щелчке мышью.

+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

Смежные вопросы