Sie müssen dafür Ihren eigenen Delegierten implementieren.
In Qt haben Sie neben den Daten, dem Modell und der View Ihre Delegierten . Sie stellen Eingabefähigkeiten bereit und sie sind auch dafür verantwortlich, "spezielle" Elemente in der Ansicht darzustellen, was Sie brauchen.
Qt doc hat eine gute Abdeckung für diese (Schlüsselwörter: Model/View programming
), und Sie finden auch einige Beispiele hier und hier .
Auch (ein wenig off-topic, aber ich denke, ich sollte darauf hinweisen), wenn Sie eine gewöhnliche QTableWidget
verwenden, können Sie alles in eine beliebige Zelle mit seiner setCellWidget()
-Funktion einfügen.
UPD
Hier ist ein leicht modifiziertes Beispiel von Qt docs (ich sauge mit Model / View Zeug in Qt, also schlage mich nicht hart für diesen Code). Es wird eine Schaltfläche in jeder Zelle auf der rechten Seite zeichnen und die Klickereignisse in Zellen abfangen, um zu überprüfen, ob der Klick auf dem "Button" war, und entsprechend reagieren.
Wahrscheinlich ist das nicht der beste Weg, es zu tun, aber wie gesagt, ich bin nicht gut mit Qt's Modellen und Ansichten.
Um die Dinge richtig zu machen und eine korrekte Bearbeitung zu ermöglichen, müssen Sie auch die Funktionen createEditor()
, setEditorData()
und setModelData()
implementieren.
Um Ihre Sachen in einer bestimmten Zelle anstatt aller Zellen zu zeichnen, fügen Sie einfach eine Bedingung in die paint()
-Funktion ein (beachten Sie, dass sie den Modellindex als Argument erhält, damit Sie immer wissen, in welcher Zelle Sie malen, und male entsprechend).
delegate.h:
%Vor%delegate.cpp:
%Vor%main.cpp
%Vor%Das Ergebnis sieht folgendermaßen aus:
Ich habe eine Lösung OHNE eine komplexe Neu-Erfindung der gesamten Lackierprozesse. Ich habe eine TableView, in der ich in jeder Zeile eine Schaltfläche habe. Beachten Sie, dass in meinem Fall die for-Schleife durch jede Zeile läuft.
%Vor%Dann erhalten Sie automatisch den Index der Zeile, in der der Benutzer auf die Schaltfläche geklickt hat. Sie müssen nur Ihren eigenen Slot machen:
%Vor%Wenn Sie bestimmte Zellen haben, würde es ähnlich funktionieren.
Beachten Sie, dass mir Speicherlecks in diesem Beispiel nicht wichtig waren, und ich weiß nicht genau, was passieren würde, wenn Sie Ihr TableView aktualisieren ... (Es funktioniert gut, aber es löscht möglicherweise nicht die alten Button-Zeiger wenn neue erstellt werden)
setIndexWidget hat für mich funktioniert. Beispiel:
%Vor%Wenn Sie nur eine Schaltfläche hinzufügen und etwas darauf klicken möchten, funktioniert das Hinzufügen einer Schaltfläche mit setIndexWidget () problemlos. Ich glaube, wir brauchen weder die umständliche Malmethode noch die Implementierung von Delegierten.
Wenn die Ansicht eine Zelle zeichnen möchte, ruft sie die paint () -Funktion des Delegaten mit einigen Informationen darüber auf, wie, was und wo der Inhalt der Zelle gezeichnet werden soll. Der Standarddelegat zeichnet nur den Qt :: DisplayRole-Text und den Auswahlstatus. Wenn Sie den Delegaten ersetzen, ersetzen Sie das Standardverhalten vollständig: Sie können zeichnen, was Sie möchten. Wenn Sie den Text wollen, müssen Sie ihn arrangieren. Sie können es selbst tun oder mit Standard-C ++ - Mechanismen können Sie zuerst den Standard-Zeichnungscode aufrufen und dann oben zeichnen. Es funktioniert nach dem Hinzufügen von QItemDelegate :: paint (Maler, Option, Index); zu Beginn meiner paint () Methode.