2009-06-13 6 views
3

Ich versuche, eine Unterklasse von QTableView, die eine eingebettete QLineEdit an der Spitze zum Filtern der Ergebnisse as-you-type zu machen. Ich brauche meine Tabelle, um die gleiche API wie ein normales QTableView zu haben, also möchte ich es subclassing subclassing QWidget subklassifizieren und ein QLineEdit und QTableView dazu hinzufügen.Wie wird ein Widget abgeleitet, um weitere Elemente hinzuzufügen?

Ich dachte, ich könnte nur neu implementieren paintEvent(QPaintEvent*), verändern die QPaintEvent ‚s rect() etwas niedriger zu starten (die Höhe eines QLineEdit, so zieht es unter ihm) und dann durch zu QTableView::paintEvent() passieren, aber das QPaintEvent Argument bestimmt nur, welche Region neu gezeichnet werden muss, nicht die Region, in der das Widget gemalt werden soll.

+0

Warum sind Sie dagegen, ein kombiniertes Widget zu erstellen und den "harten" Weg zu gehen? –

+0

Weil dann der Code so aussieht: public: void setModel (QAbstractItemModel * m) {table-> setModel (m); } QWidget * horizontalHeader() {return table-> horizontalHeader(); } QWidget * verticalHeader() {return table-> verticalHeader(); } [snip] Alle Signale, die QTableView ausstrahlt, enden auf die gleiche Weise: Ich müsste sie alle auf die externe Schnittstelle meines Widgets abbilden. –

+2

oder Sie könnten einfach ein Getter für das QTableView * von Ihrem Widget machen. :) –

Antwort

1

Ich würde versuchen, die paintEventO überschreiben, die widget::pos Ändern abit niedriger als es und rufen Sie ist QTableView::paintEvent()

+0

Aufruf von move() oder QTableView :: move() in MyTable :: paintEvent() übersetzt einfach das gesamte Widget (einschließlich des QLineEdit-Members). Ich bin nicht einmal sicher, warum QLineEdit gezeichnet wird, seit meinem paintEvent ruft nur QTableView :: paintEvent() auf, was nicht explizit Member-Widgets zeichnet. –

7

Alles, was Sie in dieser Hinsicht tun, ist in nur so viel Arbeit (wahrscheinlich mehr Arbeit sein würde Hacky und führen) als manuelle Zuordnung aller Signale und Slots zu einem Kind-Widget. Sie müssen viel mehr tun, als nur die Malereignisse zu ändern, Sie müssten auch alle Mausereignisse anpassen, alle Aktualisierungsrechtecke anpassen, usw.

Alternativ können Sie auch einfach die QTableView-Klasse von der Qt-Quelle und ändern Sie es direkt (obwohl das LGPL bricht wahrscheinlich und müssen Sie Ihre Quelle veröffentlichen, wenn Sie keine kommerzielle Lizenz haben.) Aber die einfachste Methode zu reinigen wird ein Container-Widget mit dem QTableView als implementieren Kind.

1

Ich muss Daniel zustimmen: Ich denke nicht, dass dies der richtige Ansatz ist. Wahrscheinlich möchten Sie ein benutzerdefiniertes Widget mit einer Linienbearbeitung zum Durchführen der Filterung erstellen. Ansonsten betrittst du die herausfordernde Welt des Qt-Hacking.

Wenn Sie wirklich Zugriff auf die QTableView-Schnittstelle bereitstellen müssen, fügen Sie einfach eine public get-Methode hinzu, die einen Verweis auf die Tabelle zurückgibt.

Dies ist etwas ähnlich wie Qt bietet eine QTabWidget-Klasse, die QWidget erbt aber eine private QTabBar, die es intern verwendet. Ein wichtiger Unterschied ist, dass es einen geschützten TabBar() Accessor eher als einen öffentlichen bietet.

Verwandte Themen