Seite 1 von 1

Variabel auf Objektnamen zugreifen?

Verfasst: 19. Mai 2009 19:27
von listeman
Hallöchen,

ich habe eine kleine Frage:
Und zwar möchte ich in einer kleinen QT-Anwendung auf eine Reihe von QLineEdits (insgesamt 25) zugreifen. Es ist zwar möglich, immer alle einzeln aufzuführen, jedoch wäre es doch erheblich leichter, die ganze mithilfe einer Schleife zu durchlaufen (der Objektname ist immer nach dem gleichen Schema: "Titel01" bis "Titel25").
Die Namen aufzustellen ist kein Problem, aber ich komme an dem Punkt nicht weiter, an dem ich auf das Element mit diesem Namen zugreifen muss. Die Elemente sind in ner ui-Datei.
Ein einfaches

Code: Alles auswählen

ui->variableTitel->setEnabled(true);
(variableTitel ist dabei der String mit dem Objektnamen)

funktioniert aus logischen Gründen natürlich nicht. Der sucht dann ja nach einem Objekt mit dem Name "variableTitel" und nicht nach dem Objekt mit dem Inhalt dieser Variablen zum Namen.

Doch genau das bräuchte ich. Wäre echt froh, wenn mir da jemand helfen könnte, da ich im Moment total ratlos bin :-)


Schon mal nen Danke!

Grüßle listeman

Verfasst: 19. Mai 2009 19:35
von solarix
"findChild<QLineEdit*>("Titel01")" ist das was du suchst.. http://doc.trolltech.com/4.5/qobject.html#findChild

hth...

Verfasst: 19. Mai 2009 19:55
von listeman
Danke für die schnelle Antwort :-)

Das ist es, was ich gesucht habe... will nur leider net funktionieren, das Programm stürtzt dabei immer ab. Der verantwortliche Code sieht so aus:

Code: Alles auswählen

int i = 1;
QString Name = "Titel";
while(i < 26) {
	if(i < 10) {
		Name = Name + "0";
	}
	Name = Name + QString("%1").arg(i);
	QLineEdit *titel = ui->scrollArea->findChild<QLineEdit *>(Name);
	titel->setEnabled(true);
	i = i + 1;
	Name = "Titel";
}
Finde aber keinen Fehler da drinnen...

Verfasst: 19. Mai 2009 20:23
von upsala
Du verwendest keinen Debugger und du überprüfst keine Rückgabewerte...

Verfasst: 19. Mai 2009 20:26
von solarix
Pointer prüfen!

Code: Alles auswählen

Q_ASSERT(ui->scrollArea); // wird im kommenden Abschnitt benoetigt
int i = 1;
QString Name = "Titel";
while(i < 26) {
   if(i < 10) {
      Name = Name + "0";
   }
   Name = Name + QString("%1").arg(i);
   qDebug()  << "Pruefe" << Name;
   QLineEdit *titel = ui->scrollArea->findChild<QLineEdit *>(Name);
   if (titel) {
     qDebug() << Name << "gefunden";
     titel->setEnabled(true);
   } else {
    qDebug() << Name << "nicht gefunden";
   }
   i = i + 1;
   Name = "Titel";
} 

Verfasst: 19. Mai 2009 20:38
von listeman
Es funktioniert! :D

Das problem war, dass ich statt "Titel14" "Titel13_2" als Objektname hatte... da hat er mir im Debug-Modus auch den Fehler angezeigt... jetzt funktioniert es prima!

Nen herzliches Dankeschön an solarix! :-)

Grüßle listeman

Verfasst: 20. Mai 2009 09:13
von pfid
Du kannst es alternativ auch mit allen Childs machen, unabhängig vom Objektnamen. Dementsprechend würde deine Schleife nicht von 1-26 gehn, sondern einfach über alle Child-Widgets des angegebenen Parents - hier deine Scrollarea.

Code: Alles auswählen


foreach (QLineEdit* e, ui->scrollArea->findChildren<QLineEdit*>)
   doSomethingWith(e);