Variabel auf Objektnamen zugreifen?

Alles rund um die Programmierung mit Qt
Antworten
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Variabel auf Objektnamen zugreifen?

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

"findChild<QLineEdit*>("Titel01")" ist das was du suchst.. http://doc.trolltech.com/4.5/qobject.html#findChild

hth...
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du verwendest keinen Debugger und du überprüfst keine Rückgabewerte...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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";
} 
listeman
Beiträge: 74
Registriert: 19. Mai 2009 13:54
Kontaktdaten:

Beitrag 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
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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);
Antworten