(QT) Gui Test, Zugriff auf Unterelemente eines Widgets



  • Nach ersten Erfahrungen mit QTest fang ich nun an erste GUI Tests zu schreiben. Die Tutorils die bei Qt dabei sind und dieses: http://developer.kde.org/documentation/tutorials/writingunittests/tute3.html

    Meine Frage is relativ Grundlegend: wie kann man auf Unterelemente eines Widgets zugreifen? Also ich hab kein Problem ein Objekt des zu testenden Widgets anzulegen, nur wie mach ich dann weiter? Meiner Meinung nach müsste ich irgendwie auf die Unterelemente zugreifen um sie dann zu manipulieren/ auszulsen -analog zu den Tutorials.

    Für QObject gibts ja ein "findChild(name)" gibt es sowas ähnliches für Widgets?

    Danke im Voraus



  • dermoritz schrieb:

    Für QObject gibts ja ein "findChild(name)" gibt es sowas ähnliches für Widgets?

    QWidgets sind doch auch Q_OBJECTs, also solltest du diese Methode doch nutzen können?

    Desweiteren gibt es noch childAt(), um ein Child an einer bestimmten Koordinate zu bekommen.



  • danke kenny, die lösung die ich inzwischen hab benutzt qobjects funktion children:

    template < typename T >
    T* getChild(QObject* parent,QString name)
    {
    	QObjectList children = parent->children();
    	foreach(QObject* child,children)
    	{
    		if (child->objectName() == name)
    		{
    			return qobject_cast<T*>(child);
    		}
    	}
    	return 0;
    }
    

    ich hätte tatsächlich gedacht das es für genau das schon eine fertige funktion gibt. solange ich nix besseres hab werd ich halt das benutzen.



  • dermoritz schrieb:

    ich hätte tatsächlich gedacht das es für genau das schon eine fertige funktion gibt.

    Diese ?



  • mhm - ich glaube ja :-). --also danke

    aber heute früh habe ich findChild schonmal in der hand gehabt und aus irgendeinem grund verworfen - es ist nicht unwahrscheinlich das dieser grund
    inzwischen nichtig ist.

    naja da hba ich mich wohl etwas im kreis gedreht...

    edit: ... so habs mal probiert und funzt wunderbar - danke!
    zumindest mein gefühl, dass ich versuche ein rad neu zu erfinden war richtig 😉



  • dermoritz schrieb:

    Meine Frage is relativ Grundlegend: wie kann man auf Unterelemente eines Widgets zugreifen?

    Da du in der Programmierung mit Qt noch ein Anfänger zu sein scheinst, verwundert es mich gerade ein wenig wozu du Funktionen wie findChild() überhaupt brauchen könntest?

    Ich hab schon mehrere größere Projekte mit Qt realisiert, auf eine Funktion wie findChild() hab ich bis jetzt jedoch noch nie zurückgreifen müssen.

    Vielleicht hast du irgendwo einen grundlegenden Denkfehler?



  • die funktion brauche ich für gui tests mit qtestlib. ich suche ein bestimmtes unterlelement, z.b. textfeld um mit diesem element dann gui test zu machen. z.b. dinge eingeben und reaktionen prüfen.

    falls es da eine bessere möglichkeit gibt - immer her damit



  • dermoritz schrieb:

    falls es da eine bessere möglichkeit gibt - immer her damit

    Ich bin mir nicht sicher ob du das in deinem Fall auch so machen kannst..

    ..aber normalerweise speichert man eben einfach die Zeiger auf die Objekte, die man anlegt, als Membervariablen der jeweiligen Klasse zu dem die Objekte gehören.
    Dann kann man jederzeit wieder auf sie zugreifen ohne erst nach ihnen suchen zu müssen.

    #include <QWidget>
    #include <QLineEdit>
    
    class MyWidget : public QWidget
    {
    	Q_OBJECT
    
    public:
    	MyWidget(QWidget *parent = 0, Qt::WFlags flags = 0);
    	~MyWidget();
    
    	void test();
    
    	QLineEdit *m_edit;
    
    };
    
    MyWidget::MyWidget(QWidget *parent, Qt::WFlags flags) : QWidget(parent, flags)
    {
    	m_edit = new QLineEdit(this); // Darauf kannst du auch später noch problemlos zugreifen
    
    	QLineEdit *edit2;
    	edit2 = new QLineEdit(this); // Hierauf nicht mehr so einfach..
    
    }
    
    MyWidget::~MyWidget()
    {
    
    }
    
    MyWidget::test()
    {
         // Klappt problemlos
         m_edit->setText("OK");
    
         // Auf das zweite Edit haben wir jedoch keinen Zeiger mehr...
         // Deswegen müssten wir hier jetzt das Objekt erst einmal suchen bevor wir darauf zugreifen können
    }
    


  • in meinem fall hab ich den zu testenden code aber nicht erstellt. und ich kann froh sein wenn die unterelemente überhaupt (eindeutige)namen haben. in meinem speziellen fall greife ich über ein interface auf das zu testende widget zu und dieses interface ist sehr sehr dünn.

    in zukunf ist aber geplant schnittstellen/klassen etwas testfreundlicher zu implementieren. dein vorschlag wird dabei sehr hilfreich sein - vielleicht implementiert man ein spezielles testinterface?!


Anmelden zum Antworten