[gelöst] QT4.2 installEventFilter on QTableWidgetItem

Alles rund um die Programmierung mit Qt
Antworten
Bolle
Beiträge: 14
Registriert: 11. Dezember 2006 16:22

[gelöst] QT4.2 installEventFilter on QTableWidgetItem

Beitrag von Bolle »

In einer GroupBox habe ich verschiedene Childwidgets.

Unter anderem ist dabei auch ein QTableWidget. Ich will nun einen EventFilter auf die verschiedenen Item in der Tabelle setzte.

Den Filter auf die Tabelle (lediglich den Rahmen) zu setzen klappt mit:

Code: Alles auswählen

_table->installEventFilter(this);
Ich möchte aber eben die Events auf den Items filtern.[/quote]
Zuletzt geändert von Bolle am 15. Dezember 2006 17:06, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QTableWidgetItems haben keine Events und sind auch nicht von QObject abgeleitet, somit kannst du auch keinen Event-Filter draufsetzen.
Bolle
Beiträge: 14
Registriert: 11. Dezember 2006 16:22

Beitrag von Bolle »

upsala hat geschrieben:QTableWidgetItems haben keine Events und sind auch nicht von QObject abgeleitet, somit kannst du auch keinen Event-Filter draufsetzen.
dann muss ich mit meiner Frage doch ein wenig weiter ausholen:

Ich habe eine Tabelle in der hinter jedem Eintrag ein Foto liegt. Wenn in der Tabelle ein Foto ausgewählt wird, soll es angezeigt werden. Da ich aber mit geklickter Maustaste und selektiertem Item die Tabelle 'traversieren' kann, möchte ich, dass in der Anzeige das Bild erst dann geladen wir, wenn ich die Taste wieder loslasse. Dazu wollte ich releaseButton abfangen, aber den gibts nun ja nicht. Hat jemande eine Idee wie ich das umgehen könnte?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QTableWidget hat ein void mouseReleaseEvent(QMouseEvent *event). Das kannst du überschreiben und deine Funktion realisieren.
Bolle
Beiträge: 14
Registriert: 11. Dezember 2006 16:22

Beitrag von Bolle »

upsala hat geschrieben:QTableWidget hat ein void mouseReleaseEvent(QMouseEvent *event). Das kannst du überschreiben und deine Funktion realisieren.

Code: Alles auswählen

bool InfoWidget::eventFilter(QObject* target, QEvent* event)
{
	if (target==_table){
		if(event->type() == QEvent::MouseButtonPress){
			std::cout << "event filter MouseButtonPress" << std::endl;
			return true;
		}
		if(event->type() == QEvent::MouseButtonRelease){
			std::cout << "event filter MouseButtonRelease" << std::endl;

			return true;
		}
	}
	return false;
}
ich dachte ich hätte dies bereits in meinem EventFilter abgefangen. Selstamerweise löst sich der Event aber nur dann aus, wenn ich exakt auf den Rahmen der Tabelle klicke. Überall sonst bleibt die Ausgabe stumm?! :cry:
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Bist du dir sicher, daß die Events vom richtigen Widget abfängst?
Bolle
Beiträge: 14
Registriert: 11. Dezember 2006 16:22

Beitrag von Bolle »

upsala hat geschrieben:Bist du dir sicher, daß die Events vom richtigen Widget abfängst?
ja, da bin ich mir ganz sicher
Bolle
Beiträge: 14
Registriert: 11. Dezember 2006 16:22

[Lösung]

Beitrag von Bolle »

Der EventFilter muss auf dem Viewport installiert werden!

Code: Alles auswählen

_table->viewport()->installEventFilter(this);

Code: Alles auswählen

bool InfoWidget::eventFilter(QObject* target, QEvent* event)
{
	if (target==_tableOfPlates->viewport()){
		if(event->type() == QEvent::MouseButtonPress){
			std::cout << "event filter MouseButtonPress" << std::endl;
			_mousePressed=true;
			return true;
		}
		if(event->type() == QEvent::MouseButtonRelease){
			std::cout << "event filter MouseButtonRelease" << std::endl;
			_mousePressed=false;
			return true;
		}
	}
	return false;
}
danke upsala für deine Mühen
Antworten