2016-07-26 21 views
1

Ich erstelle einige automatisierte GUI-Tests in meiner Anwendung mit QTest.Wie bekomme ich Zugriff auf eine QMessageBox von QTest

kann ich die Widgets aus meiner Anwendung Zugriff auf den Befehl:

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

Es funktioniert gut, aber jetzt habe ich auf die OK-Taste eines QMessageBox klicken.

Ich habe die QMessageBox in meiner Anwendung wie folgt aus:

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

Wie kann ich Zugang zu diesem QMessageBox haben und seine Tasten?

Antwort

1

Ich fand eine Lösung auf dem folgenden Link: http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib.

Es verwendet den Befehl QApplication::topLevelWidgets();, um eine Widget-Liste zu erhalten. Dann sucht es nach dem Meldungsfeld-Widget und simuliert einen Schlüssel eingeben (QTest::keyClick(mb, Qt::Key_Enter);), die das Meldungsfeld schließt.

Beispiel:

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); 
     } 
    } 
} 

Die Header-Datei muss den Q_OBJECT Makro, um die Signale und Slots Mechanismus zu verwenden. Beispiel:

class MyClass: public QWidget 
{ 
    Q_OBJECT 
public: 
    ... 

Es funktionierte gut für mich, da die UI (Thread) blockiert wird, wenn das Meldungsfeld angezeigt.

Hinweis: Speichern Sie das Projekt neu zu erstellen, wenn Sie die Q_OBJECT Makro hinzufügen.

2

Oft hilft es, zu Qt's auto tests aussehen:

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; 
    } 
} 

von diesem Code zu urteilen, können Sie das Meldungsfeld über QApplication::activeModalWidget() bekommen. Das Testen nativer (ich nehme an, sie sind native) Widgets ist schwierig, weshalb sie wahrscheinlich Schlüsselereignisse senden, da Sie z. die Position der Schaltflächen für diese, wie Sie es mit einem Mausklick tun würden.

+0

Danke @Mitch für Ihre Mühe. Ich fand eine Lösung auf dem folgenden Link: [http://www.qtcentre.org/threads/31239-Testing-modal-dialogs-with-QTestLib](http://www.qtcentre.org/threads/31239-Testing -modal-dialogs-with-QTestLib). Es verwendet 'QApplication :: topLevelWidgets();' und hat gut funktioniert. Danke noch einmal. – KelvinS