Seite 1 von 1

[gelöst] QT4.2 installEventFilter on QTableWidgetItem

Verfasst: 15. Dezember 2006 16:05
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]

Verfasst: 15. Dezember 2006 16:15
von upsala
QTableWidgetItems haben keine Events und sind auch nicht von QObject abgeleitet, somit kannst du auch keinen Event-Filter draufsetzen.

Verfasst: 15. Dezember 2006 16:22
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?

Verfasst: 15. Dezember 2006 16:25
von upsala
QTableWidget hat ein void mouseReleaseEvent(QMouseEvent *event). Das kannst du überschreiben und deine Funktion realisieren.

Verfasst: 15. Dezember 2006 16:39
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:

Verfasst: 15. Dezember 2006 16:55
von upsala
Bist du dir sicher, daß die Events vom richtigen Widget abfängst?

Verfasst: 15. Dezember 2006 17:02
von Bolle
upsala hat geschrieben:Bist du dir sicher, daß die Events vom richtigen Widget abfängst?
ja, da bin ich mir ganz sicher

[Lösung]

Verfasst: 15. Dezember 2006 17:08
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