[gelöst] Radiobuttons dynamisch erzeugen -> Nimm Qlist

Alles rund um die Programmierung mit Qt
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

[gelöst] Radiobuttons dynamisch erzeugen -> Nimm Qlist

Beitrag von pumuckl »

Hallo,

ich lese aus einer Datenbanktabelle Strings aus. Die Anzahl der Strings kann sich bei jedem Programmstart ändern. Für jeden dieser Strings soll ein Radiobutton dynamisch erzeugt werden, der sowohl als Objektbezeichnung als auch als Text den String beinhaltet:

Code: Alles auswählen

1 - QString name;
2 - QGridLayout *vblgroupbox1 = new QGridLayout;
3 - int i=0;
4 - QSqlQuery query;
5 - query.exec("select hk, hb FROM hz ORDER BY hkurzform");
6 - while (query.next()) {
7 -     name = query.value(1).toString();
8 -      rbuttons[name] = new QRadioButton(tr("%1").arg(name));
9-       vblgroupbox1->addWidget(rbuttons[name],0,i);
10-     ++i;
11- }
Leider funktioniert das dynamische Erzeugen der Radiobuttons in der Zeile 8 so nicht! Das setzen des Textes für den jeweiligen Radiobutton hingegen funktioniert
(schon getestet)!

Kann mir da jemand weiterhelfen?

Wenn das oben mit dem Einbinden des Strings überhaupt nicht funktionieren sollte, würde mir auch folgendes reichen (der Name des Objektes wird hier inkrementiert):

Code: Alles auswählen

1 - QString name;
2 - QGridLayout *vblgroupbox1 = new QGridLayout;
3 - int i=0;
4 - QSqlQuery query;
5 - query.exec("select hk, hb FROM hz ORDER BY hkurzform");
6 - while (query.next()) {
7 -     name = query.value(1).toString();
8 -      rbuttons[i] = new QRadioButton(tr("%1").arg(name));
9 -     vblgroupbox1->addWidget(rbuttons[name],0,i);
10-    ++i;
11- }
Danke!
Zuletzt geändert von pumuckl am 4. Januar 2007 23:14, insgesamt 3-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was heißt, es funktioniert nicht? Fehlermeldung? Wie ist rbuttons definiert?
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

rbuttons soll ja inner halb der Schleife dynamisch definiert werden!

Die Fehlermeldung:

Code: Alles auswählen

Koschi@linuxhost:~/Computer/progs/qt-programme/08-db-form> make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtSql -I/usr/local/Trolltech/Qt-4.2.0/include/QtSql -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. -o tableeditor.o tableeditor.cpp
tableeditor.cpp: In constructor ‘TableEditor::TableEditor(const QString&, QWidget*)’:
tableeditor.cpp:216: error: ‘rbuttons’ was not declared in this scope
tableeditor.cpp:69: warning: unused variable ‘groupbox2’
make: *** [tableeditor.o] Fehler 1
wenn ich die Zeile 8 durch

Code: Alles auswählen

QRadioButton *rbuttons[name] = new QRadioButton(tr("%1").arg(name));
ersetze, kommt:

Code: Alles auswählen

g++ -c -pipe -O2 -Wall -W -D_REENTRANT  -DQT_NO_DEBUG -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.2.0/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtCore -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtGui -I/usr/local/Trolltech/Qt-4.2.0/include/QtSql -I/usr/local/Trolltech/Qt-4.2.0/include/QtSql -I/usr/local/Trolltech/Qt-4.2.0/include -I. -I. -I. -o tableeditor.o tableeditor.cpp
tableeditor.cpp: In constructor ‘TableEditor::TableEditor(const QString&, QWidget*)’:
tableeditor.cpp:217: error: size of array ‘rbuttons’ has non-integral type ‘QString’
tableeditor.cpp:217: error: cannot convert ‘QRadioButton*’ to ‘QRadioButton* [1]’ in initialization
tableeditor.cpp:218: error: no match for ‘operator[]’ in ‘rbuttons[name]’
tableeditor.cpp:69: warning: unused variable ‘groupbox2’
make: *** [tableeditor.o] Fehler 1

franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

hi,

Du musst entweder in deiner Klassendeklaration (als private-Element) oder VOR der Schleife dein Array (oder eben einen Zeiger auf QRadioButton) anlegen.
Grund:
Beim Verlassen der Schleife ist dein Array futsch!

Die erste Variante geht auch net, weil du als Index für Arrays nur int nehmen kannst, und niemals (Q)Strings! Außer du schreibst eine eigene Klasse, abgelitten von QRadioButton, und überlädst den Index-Operator.

Grüße
Franz
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

tableeditor.cpp:216: error: ‘rbuttons’ was not declared in this scope
Tja, so wird das nichts, du mußt rbuttons schon irgendwo definieren. Also schreib irgendwo vor deine While-Schleife:

Code: Alles auswählen

QHash<QString, QRadioButton*> rbuttons
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

Hallo upsala,

Code: Alles auswählen

    QString name;
    QRadioButton *rbuttons[20];
    QSqlQuery query;
    query.exec("select hkurzform, hbeschreibung FROM hauptzweck ORDER BY hkurzform ");
    int i=0;
    while (query.next()) {
        name = query.value(1).toString();
	rbuttons[i] = new QRadioButton(tr("%1").arg(name));
        vblgroupbox1->addWidget(rbuttons[i],0,i+10);
        ++i;
     }
funktioniert prächtig. Allerdings muss ich vorher die ungefähre Anzahl der Radiobuttons abschätzen. Wie und wo binde ich denn

Code: Alles auswählen

QHash<QString, QRadioButton*> rbuttons
in den obigen Quelltext ein?

zu franzf:

Ich habe mir schon überlegt, eine Kreuzung aus QComboBox und QRadioButton zu erstellen. Aber zuerst schaue ich mir mal das Überladen mal an!! Da hab ich nämlich (noch) keine Erfahrung...

Trotzdem Danke Euch beiden!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

pumuckl hat geschrieben:Allerdings muss ich vorher die ungefähre Anzahl der Radiobuttons abschätzen.
Abschätzen brauchst du nicht. Kannst doch mit der SQL-Funktion "count" die Anzahl der Einträge ermitteln.
Schau dich einfach mal in der SQL-Doku deiner Wahl um ;)
Dann brauchst du das Array nur nach der SQL-Abfrage erzeugen.

Oder arbeite doch gleich mit einer dynamischen Datenstruktur ala QList, list, vector, etc... Dann brauchst du gar nicht zählen wie viele Einträge kommen ;)
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

[gelöst] Radiobuttons dynamisch erzeugen

Beitrag von pumuckl »

Danke! Die mit count entstandene Lösung reicht mir dann völlig aus. :D Hätte ich auch selbst drauf können, aber wenn man so intensiv an einer Stelle arbeitet, hat man manchmal Scheuklappen auf bzw. fehlt einem dann der nötige Abstand, um so was zu erkennen! :idea:

Vielen Dank!!
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

Ich habs jetzt mal probiert: die Funktion "count" gibt es für QSQLQuery nicht! Dafür jedoch "size"! "Size" funktioniert aber nicht (ich benutze SQLite? - daran dürfte es aber nicht liegen), d.h. es wird compiliert, aber das Ergebnis ist 0.

"count" gibt es zwar unter QSQLRecord, damit wird aber nur die Anzahl der Spalten eines Datensatzes zurückgegeben.

Momentan funktioniert es mit einem doppelten Durchlauf des Ergebnissets von QSQLQuery, wobei mir das nicht sonderlich elegant scheint. Geht es irgendwie noch besser?

Code: Alles auswählen

    QString name;
    QSqlQuery query;
    query.exec("select hkurzform, hbeschreibung FROM hauptzweck ORDER BY hkurzform ");
    int i=0;
    while (query.next()) {++i;}
    QRadioButton *rbuttons[i];
    query.first();
    i=0;
    while (query.next()) {
        name = query.value(1).toString();
	     rbuttons[i] = new QRadioButton(tr("%1").arg(name));
        vblgroupbox1->addWidget(rbuttons[i],0,i);
        ++i;
     }
Danke!
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Gibt es einen besonderen Grund, weshalb du hier ein Array verwendest? Als Alternative würde sich hier meines Erachtens QList<QRadioButton> anbieten, da du hierbei im Vorfeld nicht wissen musst, wie viele Buttons du erzeugen willst und von der Handhabung gestaltet sich der Umgang mit QList ähnlich einfach wie ein Array.

Vielleicht hilft dir der Gedankenanstoss ja weiter. Viel Erfolg.

HeikoB
pumuckl
Beiträge: 23
Registriert: 26. November 2006 22:01

Beitrag von pumuckl »

Hallo heikob,

das hört sich gut an. Ich stell mir in dem Sinne eine QList als eine Kette vor, in der die einzelnen QRadioButtons angehangen werden. Lieg ich so richtig? Kannst du das bitte etwas näher erläutern und mir vielleicht ein Code-Beispiel entsprechend meiner obigen Doppelschleife mitliefern.

Danke!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wir sind kein Vorleseservice:
http://doc.trolltech.com/4.2/qlist.html
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Na gut, ich versuchs mal, allerdings ungetestet. ;-)

Ich mache es hier mal bewusst umständlich in zwei for-Schleifen. Es geht auch in einem Rutsch.

Code: Alles auswählen

QList<QRadioButton> rbuttons;
...
while (query.next()) 
{
QRadioButton tmp =  new QRadioButton(query.value(1).toString());
rrbuttons.append(tmp);
} 

for(i=0;i<rbuttons.count();i++)
{
//müsste auch funktionierten
vblgroupbox1->addWidget(rbuttons[i],0,i);
//funktioniert sicher
vblgroupbox1->addWidget(rbuttons.at(i),0,i);
}
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du hast vergessen, daß du mit Pointern arbeitest:

Code: Alles auswählen

QList<QRadioButton*> rbuttons; 
... 
while (query.next()) { 
  QRadioButton *tmp =  new QRadioButton(query.value(1).toString()); 
  rrbuttons.append(tmp); 
} 
 
for(i=0; i<rbuttons.count(); i++) { 
  //müsste auch funktionierten 
  vblgroupbox1->addWidget(rbuttons[i],0,i); 
 //funktioniert sicher 
  vblgroupbox1->addWidget(rbuttons.at(i),0,i); 
}
heikob
Beiträge: 81
Registriert: 23. März 2005 23:20

Beitrag von heikob »

Upps, ja. Das kommt davon, wenn man zwischendurch mit C# arbeitet. ;-)

Ich bitte vielmals um Entschuldigung
Antworten