Seite 1 von 1

[solved] Zugriff auf Widgets in QGridLayout

Verfasst: 4. Januar 2007 09:17
von doc750
Hi,

ich habe einem QGridLayout mehrere Widgets hinzugefügt, welche ich nun an anderer Stelle im Code bearbeiten möchte. Hierzu benötige ich den Zugriff auf diese Widgets.

Auszüge aus dem Code:
m_id3View = new QWidget; // m_id3View member von MainWindow
...
QGridLayout *id3Layout = new QGridLayout;
QLineEdit *titleEdit = new QLineEdit();
id3Layout->addWidget(titleEdit,0,0);
...
m_id3View->setLayout(id3Layout);
...

Wie komme ich nun an andere Stelle in der Klasse MainWindow wieder an meine Widgets um z.B. den Text für das Widget titleEdit zu setzen?
Alles was ich habe ist der Zeiger m_id3View.

Ich möchte die Zeiger auf die Widgets nicht "zwischenspeichern".

Ich habe nun schon mehrmals die Hilfe durchsucht, verschiedene Dinge ausprobiert, im Forum gesucht und Mr. Google befragt. Ich komm nicht drauf.

Kann mir jemand einen Tipp geben?

Gruß Uwe

Verfasst: 4. Januar 2007 09:37
von Christian81
Ohne zwischenspeichern (d.h. als Member der Klasse deklarieren wie es auch der Designer/uic macht) wird es wohl nichts werden.

Verfasst: 4. Januar 2007 09:54
von upsala
Einfach ist es nicht, aber versuch es über folgende Funktionen:

Code: Alles auswählen

QRect QGridLayout::cellRect ( int row, int column ) const
QWidget *QWidget::childAt ( int x, int y ) const

Verfasst: 4. Januar 2007 10:48
von doc750
QWidget *QWidget::childAt ( int x, int y ) const

hatte ich schon ausprobiert. childAt() liefert mir in meinem Fall ein NULL Pointer. Ich nehme daher an, dass die Widgets - welche mit addWidget dem Layout hinzugefügt wurden - nicht autom. Childwidgets sind.

QRect QGridLayout::cellRect ( int row, int column ) const

Hier fehlt mir der weitere Link, zwischen "ich habe die Koordinaten des Widgets" zu "ich habe den >Zeiger< auf das Widget". Habe in der Hilfe von QGridLayout nichts gefunden.


Komisch ist das ganze schon, dass wenn ich einem Objekt explizit etwas hinzufüge, ich hinterher keine einfache Möglichkeit habe, das hinzugefügte wieder auszulesen. Irgendwie muss doch das "Hinzufügen" einen Grund haben, d.h. das Objekt muss doch was mit den Widgets anstellen. Hierzu muss es doch intern die Referenzen auf die Widgets haben um z.B. bei einem vegrössern des Fensters die Widgets zeichnen zu können. An genau diese Liste sollte man herankommen können...

Verfasst: 4. Januar 2007 10:50
von Christian81
...ja mit childAt(). Evtl. sind deine Widgets noch nicht visible. Aber warum das ganze so umständlich?

Verfasst: 4. Januar 2007 11:04
von doc750
Hallo Christian,

die Widgets sind sichtbar und funktionieren auch, d.h. man kann Text eingeben.

Warum so umständlich? Naja, man möchte ja eine gewisse "Eleganz/Übersicht" in seinem Code haben, d.h. es macht für mich schon einen Unterschied, ob ich über eine zentrale Referenz alle Infos bekomme, oder ob ich nach der Holzhammermethode einfach alles was ich brauche, als member definiere.

Da ich insgesamt 12 Widgets habe, die ich dem Layout hinzufüge, werde ich mir wohl doch ein Array als member machen müssen. Schliesslich will man auch nicht in "vollkommener Eleganz" zugrunde gehen ;-)

Gruß Uwe

Verfasst: 4. Januar 2007 11:05
von upsala
Also den Pointer auf das Parent-Widget mußt du schon zwischenspeichern.

Code: Alles auswählen

QWidget *wdg=parent->itemAt((layout->cellRect(row, column)).center());

Verfasst: 4. Januar 2007 11:23
von doc750
Hallo upsala,

den Pointer auf das Parent-Widget habe ich ja mit m_id3View.

Dein letzter Hinweis hat die Lösung gebracht. Mit diesem Zugriff ist es möglich, ausgehend von einem Pointer auf das Parent-Widget - unter Angabe der Grid-Koordinate das gewünschte Widget zu bekommen und darauf zuzugreifen.

Vielen Dank für deine Hilfe.

Gruß Uwe