Seite 1 von 1

ComboBox in Tabelle

Verfasst: 6. November 2007 12:47
von Ozzy
Hi,

gibt es irgendeine Möglichkeit, nicht nur Text, sondern auch Widgets, wie z.B. eine ComboBox in eine QTableWidget zu bekommen??? Oder was könnte man da sonst machen?

MfG, Ozzy

Verfasst: 6. November 2007 13:20
von Sephral
Hiho,

mit einem QTableView und einem passenden QItemDelegate klappt es auf jeden Fall (ProgressBar geht z.B. auch).

Eventuell kann man auch was machen indem man QTableWidgetItem ableitet und dann die Checkbox darin erzeugt, aber das hab ich noch nicht probiert.

Ciao,
Sephral

Verfasst: 6. November 2007 13:30
von Ozzy
Hi,

danke für Deine Antwort; davon habe ich zwar noch nie etwas gehört, aber dann werde ich mich mal auf die Suche danach begeben...

MfG, Ozzy

Verfasst: 6. November 2007 13:39
von Sephral
Hallo,

wenn du den Ansatz mit den Views verfolgen möchtest, dann fängst Du am besten hier an:

http://doc.trolltech.com/4.3/model-view ... ction.html

Du baust Dir ein einfaches Model (QAbstractItemModel ableiten). Die Items des Models enthalten die Einträge der ComboBox (falls diese unterschiedlich sein können).

Nun baust du Dir ein QItemDelegate (ableiten) das die ComboBox zeichnet und die Werte des ModelItems darin anzeigt.

Dein eigenes ItemDelegate kannst du dann dem View unterschieben mit

Code: Alles auswählen

void QAbstractItemView::setItemDelegate ( QAbstractItemDelegate * delegate ) 

Ok, es ist ein wenig Schreibarbeit, aber man kann damit am Ende viel mehr anstellen als mit den "Item-Based-Item Widgets" (heißen so in der Integration). Qt liefert ne Menge Hilfe dazu in Form von Doku und auch Beispielen.


Viel Erfolg!

Ciao,
Sephral

Verfasst: 6. November 2007 21:38
von Ozzy
Hi,

ich habe hier im Forum noch das hier gefunden:
http://www.qtforum.de/forum/viewtopic.php?p=3893&
Da steht doch quasi auch genau das, was ich suche, oder? Doch verstehe ich leider nicht, wie ich das einbauen muss. Könnt Ihr mir dabei vielleicht noch einmal helfen?

MfG, Ozzy

Verfasst: 6. November 2007 21:52
von upsala
Ich denke, daß das hier das Thema noch am besten trifft.

Verfasst: 7. November 2007 18:12
von Ozzy
Hi,

danke, aber ich komme damit irgendwie nicht weiter (und mir sitzt ein wenig die Zeit im Nacken):
was mache ich denn, wenn ich mixen will, also z.B. in ein Feld auch noch einen Button machen will?

MfG, und vielen Dank schon einmal, Ozzy

Verfasst: 7. November 2007 18:44
von upsala
und mir sitzt ein wenig die Zeit im Nacken
Das ist ehrlich gesagt nicht unser Problem...
was mache ich denn, wenn ich mixen will, also z.B. in ein Feld auch noch einen Button machen will?
In das selbe Feld? Layout verwenden und beide Widgets in das Layout reinpacken.

In ein anderes Feld? Z. B. zweites Delegate anlegen oder Delegate je nach Feld anders darstellen...

Verfasst: 8. November 2007 07:53
von Ozzy
Moin,

also was mein größtes Problem momentan ist, dass ich nicht weiß, wie bereits am Anfang das Objekt in das Feld hineinbekomme. Soll heißen: die Tabelle sieht völlig normal aus, erst wenn man mit einem Doppelklick auf das Feld klickt, erscheint die ComboBox oder der Button. Wie macht man das denn, das ab sofort das Objekt zu sehen ist?

MfG, Ozzy

Verfasst: 8. November 2007 08:00
von Ginsengelf
Moin, du könntest es mit QAbstractItemView::openPersistentEditor (QModelIndex Idx) probieren.

Ginsengelf

Verfasst: 8. November 2007 08:30
von Ozzy
Hi,

ich muss leider noch einmal nachfragen, da das alles Neuland für mich ist. Ich habe es jetzt so probiert:

Code: Alles auswählen

     for (int row = 0; row < 4; ++row) {
         for (int column = 0; column < 2; ++column) {
             QModelIndex index = model.index(row, column, QModelIndex());
			 QAbstractItemView::openPersistentEditor(index);
             //model.setData(index, QVariant((row+1) * (column+1)));
         }
     }
Er sagt dann immer:
error: cannot call member function ‘void QAbstractItemView::openPersistentEditor(const QModelIndex&)’ without object
Weißt Du, was daran falsch ist? Und noch eine zweite Frage, was ich nämlich nicht so richtig verstanden habe: die Zeile, die ich auskommentiert habe: ist die nur dafür da, am Anfang Zahlen in die Felder zu schreiben, oder bewirkt die noch mehr?
Und noch eine kleine Frage: Wie bekomme ich es hin, dass wenn ich in einer Zelle etwas aus einer ComboBox auswähle, ich in einer anderen Zelle den Text ändere? Also wenn ich z.B. in der ersten Zeile, erste Spalte aus der ComboBox "Hund" auswähle, soll in der ersten Zeile, zweite Spalte das Wort "Tier" erscheinen.

Vielen Dank für Eure Geduld, Ozzy

Verfasst: 8. November 2007 09:09
von upsala
Weißt Du, was daran falsch ist?
Ja, dir fehlen C++-Grundlagen.
openPersistentEditor(...) ist nicht statisch, außerdem hast du kein Object angegeben, aber das besagt ja die Fehlermeldung schon.

model.setData() setzt nur die Daten der Tabellenzelle, aber das steht eigentlich auch in der Doku
Und noch eine kleine Frage: Wie bekomme ich es hin, dass wenn ich in einer Zelle etwas aus einer ComboBox auswähle, ich in einer anderen Zelle den Text ändere? Also wenn ich z.B. in der ersten Zeile, erste Spalte aus der ComboBox "Hund" auswähle, soll in der ersten Zeile, zweite Spalte das Wort "Tier" erscheinen.
Kann die 2. Spalte vom Benutzer geändert werden? Wenn ja, würde ich es über das Delegate machen, wenn nein übers Model.

Verfasst: 8. November 2007 17:36
von Ozzy
Hi,

so, die Probleme habe ich alle soweit gelöst, aber eine Frage hätte ich noch:
in einem Feld sollen mehere Daten hinterlegt sein, jenachdem, was man im ersten Feld gewählt hat.
Wie speichert man so etwas am besten? Die Anzahl der Parameter kann auch verschieden sein. Gibt es da in Qt etwas passendes?

MfG, und vielen Dank schon einmal, Ozzy

Verfasst: 8. November 2007 18:58
von upsala
Gehts noch unpräziser?

Verfasst: 8. November 2007 20:11
von Ozzy
Hi,

sorry, ich probiere es etwas präziser zu machen: Also wie gesagt, je nach Auswahl in der ComboBox im ersten Feld einer jeden Zeile sollen Parameter für die 4 Zelle der jeweiligen Zeile gespeichert werden. Dies können unterschiedlich viele sein, also z.B. mal 3, mal 10. Die Länge der "Tabelle" ist dabei dynamisch, also kann während der Laufzeit geändert werden. Ich hätte einfach gerne etwas, was die Daten im "Hinterkopf" behält, da nicht alle in der Zelle angezeigt werden sollen.

Entschuldigt bitte noch einmal die echt schlampig gestellte Frage, MfG, Ozzy