[Qt Desinger]Wie Methode eines Widgets richtig überschreiben

Alles rund um die Programmierung mit Qt
Antworten
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

[Qt Desinger]Wie Methode eines Widgets richtig überschreiben

Beitrag von rubikon »

Moin.

Ich möchte auf ein Mausevent eines TableWidgets reagieren. Soweit ich herausgefunden habe müsste ich dafür die Methode mousePressEvent überschreiben.

Nun habe ich mir eine neue Klasse erzeugt die wie folgt aussieht:

Code: Alles auswählen

#include <QTableWidget>

class MyTableWidget : public QTableWidget
{
	private:
		void mousePressEvent ( QMouseEvent * event ) ;
	public:
		MyTableWidget();
};

Code: Alles auswählen

#include "MyTableWidget.h"

MyTableWidget::MyTableWidget()
{	
}

void MyTableWidget::mousePressEvent( QMouseEvent * event )
{
// Todo...
}
Wäre die Vorgehensweise bis hierhin schonmal richtig?

Wenn ja, ist nun die Frage wie ich mein TableWidget nun nicht mehr als QTableWidget sondern als MyTableWidget erstellen kann?

Die entsprechende Header Datei wird vom Qt Designer/Qt Creator ja dynamische erstellt....
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Natürlich die erste Frage: Warum denkst du, du musst von QTableWidget ableiten? Kannst du mal kurz anreißen, was letztlich erreicht werden soll?
Ansonsten: "Ein Mausevent" gibt es nicht. Es gibt MouseMove, MousePress, MouseRelease, usw. Interessiert dich nur das mousePressEvent?
Wenn du außer den Events nichts ändern willst, ist Ableiten nicht unbedingt notwendig, dafür gibt es eventFilter. Lies dich dazu in der Doku schlau.

Wenn du eine eigene Klasse hast, die du direkt im Designer einfügen willst, füge einfach das am nächsten in der Vererbungshierarchie gelegene Widget im Designer ein -> Rechtsklick darauf -> "Als Platzhalter ...usw" auswählen, und dort alles nötige eintragen.
In deinem Fall: QTableWidget einfügen, Basisklasse richtig setzen (sollte schon passen), Klassenname "MyTableWidget" und Header "MyTableWidget.h" eintragen -> fertig.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: [Qt Desinger]Wie Methode eines Widgets richtig überschre

Beitrag von padreigh »

rubikon hat geschrieben: Die entsprechende Header Datei wird vom Qt Designer/Qt Creator ja dynamische erstellt....
Wenn du umbedingt den QtDesigner nehmen willst, füge an der entsprechenden Stelle das Qxyz ein das du als Basis für deine Klasse genommen hast. Dann rechtsklick darauf und "als Platzhalter für benutzerdefinierte Klasse" auswählen.

Höchstwarscheinlich ist das was du tun willst aber viel einfacher zu erreichen. Ich musste bisher NIE irgendein mousePressEvent() re-implementieren.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

Re: [Qt Desinger]Wie Methode eines Widgets richtig überschre

Beitrag von rubikon »

Das mit dem "als Platzhalter für benutzerdefinierte Klasse" scheint ja ne super Sache zu sein. Kannte ich noch nicht. Aber wenn für diesen Anwendungsfall diese EventFilter das Richtige für mich sind, werde ich mich erst damit auseinandersetzen...

Das es kein allgemeines MausEvent gibt ist mir schon klar. Es sollte nur stellvertretend für verschiedene Events stehen, da ich denke das die Vorgehensweise unabhängig von der Art des Events gleich ist !?!
padreigh hat geschrieben: Höchstwarscheinlich ist das was du tun willst aber viel einfacher zu erreichen. Ich musste bisher NIE irgendein mousePressEvent() re-implementieren.
Was ich damit erreichen möchte ist Folgendes: Ich möchte für eine Embedded Anwendung, welche über einen Touchscreen gesteuert wird eine an z.B. das iPhone angelehnte Steuerung ermöglichen.
Konkreter: Das Scrollen meines TableWidgets soll u.a. durch 'Schubsen' möglich sein. Ich hoffe jeder weiß jetzt was ich meine.
Wenn ich Tante Google jetzt gerade richtig verstanden habe nennt man das flick bzw. Swipe and slide!?!

Das habe ich einer ersten Implementation mit den MFC wie folgt realisiert:
1. OnMouseDown Event der ListCtrl: Maus Koordinaten merken.
2. OnMouseUp Event der ListCtrl: Differenz zwischen jetzigen und gemerkten Maus Koordinaten bilden.
3. Abhängig von der gebildeten Differenzen entsprechendes Scrollevent auslösen.

Mit Qt wollt ich das analog realisieren. Aber wenn Du eine Idee hast wie man das besser oder enfacher bzw. ohne Events realisieren kann, dann nur raus damit :!:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das Scrollen meines TableWidgets soll u.a. durch 'Schubsen' möglich sein
Öh? Ich hab gedacht, dass das automatisch passiert? Ich hab jetzt schon einige Demos (z.B. klick, klick) gesehen, in allen ist dieses Feature enthalten - ich denke nicht dass so etwas jedesmal selber implementiert werden muss - wäre ja ein Unding ALLE so scrollbaren Ui-Klassen extra fürs Mobile Device nochmal ableiten zu müssen, selbst eventFilter wären absoluter Horror.
Ich gehe davon aus, dass du ABSOLUT NICHTS machen musst, um an dieses Feature zu kommen!
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

Beitrag von rubikon »

Das eine Demo bezieht sich ja scheinbar auf eine Vorabversion Qt 4.7 mit etwas was sich Qt Quick nennt. Aber ich habe immer noch das 'normale' Qt 4.6.3 :-)


Also wenn ich auf mein unverändertes QTableWidget klickt bzw. touche, werden Items selektiert.

Soll heißen: ich touche nahe des linken Randes, ziehe meinen Finger bis nahe des rechten Randes und lasse los. Nun sind alle Items die auf dem 'Weg' lagen markiert. Dies ist zwar ein tolles Feature, welches ich aber nicht brauche. In meinem Fall soll nix markiert sein und das TableWidget soll (animiert) eine Spalte nach rechts scrollen...

Wenn ich das Verhalten einfach 'umstellen' könnte, wäre das super. Ich bin sehr frisch in Qt und sah in meinem Lösungsansatz die einzige Möglichkeit.

Allerdings bin ich hier auch schon auf ein Problem gestoßen: Es wird das mousePressed Event garnicht ausgelöst.

Es werden nur die Events QEvent::FocusIn, QEvent::Paint und QEvent::Timer ausgelöst.

Jetzt brauche ich wieder Rat: Muss ich dieses Feature selbst implementieren? Wenn ja, wieso bekomme ich kein mousePressed Event?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich hab selber kein so ein Device, drum kann ich nur selber suchen - z.B. nach "touch" im Assistant. Schau dir mal an, was zu QTouchEvent in der Doku steht. Das wird dich schon ziemlich weiter bringen. Auch die Examples sind wohl brauchbar.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

padreigh hat geschrieben: .. noch nie benötigt ...
mein Qt läuft auf "großen" PCs, vielleicht darum ;) ...
rubikon hat geschrieben: ich touche nahe des linken Randes, ziehe meinen Finger bis nahe des rechten Randes und lasse los. Nun sind alle Items die auf dem 'Weg' lagen markiert. Dies ist zwar ein tolles Feature, welches ich aber nicht brauche.
dann schau mal in den (geerbten) Properties nach selectionBehavior und selectionMode
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
rubikon
Beiträge: 89
Registriert: 27. Mai 2010 13:23

Beitrag von rubikon »

padreigh hat geschrieben:
rubikon hat geschrieben: ich touche nahe des linken Randes, ziehe meinen Finger bis nahe des rechten Randes und lasse los. Nun sind alle Items die auf dem 'Weg' lagen markiert. Dies ist zwar ein tolles Feature, welches ich aber nicht brauche.
dann schau mal in den (geerbten) Properties nach selectionBehavior und selectionMode
Das habe ich schon gefunden und konnte das selektieren so 'deaktivieren'. Vielen Dank.
franzf hat geschrieben:Schau dir mal an, was zu QTouchEvent in der Doku steht. Das wird dich schon ziemlich weiter bringen. Auch die Examples sind wohl brauchbar.
Habs QTouchEvent (was es in Qt nicht alles gibt :-)) gefunden und werde mich damit mal auseinandersetzen.

Was ich allerdings komisch finde, ist das ich dieses Event im Moment im Eventfilter nicht mitbekomme :(
Antworten