Seite 1 von 1

[gelöst] QTW: Gegenstück zu cellEntered/itemEntered-Signal

Verfasst: 27. Oktober 2008 11:23
von jerry42
Guten Morgen zusammen,

ich stehe gerade vor einem kleinen Problem bezüglich meines QTableWidgets.
Das QTableWidget soll die Hintergrundfabre ändern wenn man über eine Zelle (QTableWidgetItem) mit der Maus fährt.

Das Signal cellEntered und itemEntered ist für meinen Zweck eigentlich genau richtig. Doch damit die Hintergrundfarbe wieder "normal" wird, fehlt mir ein Signal "cellLeft" oder ähnliches.

Wie kann ich dies denn Umsetzen?

Ich habe versucht noch für das darüberliegende Widget die protected-Methode "leaveEvent ( QEvent * event );" zu überschreiben. Was auch funktioniert. Allerdings wird der Hintergrund dann eben erst zurückgesetzt wenn man das komplette Widget verlässt. Wenn man die Maus aus einer Zelle bewegt, aber im freien Platz bleibt, so bleibt die Hintergrundfarbe verändert.
Diese Methode ist leider, soweit ich gesehen habe, nicht für QTableWIdget oder QTableWidgetItem vorhanden.

Ich hoffe, mir kann jemand einen Hinweis geben wie das zu lösen ist.

Vielen Dank.

Viele Grüße
jerry42

PS: Qt 4.4.3

Verfasst: 27. Oktober 2008 11:36
von jerry42
Vielleicht sollte ich noch schreiben, was ich eigentlich bezwecken will. Vielleicht gibt es dafür ja einen viel eleganteren Weg :)
Die QTableWidgetItems haben alle ein QIcon gesetzt . Nun soll eine Art MouseOver-Effect entstehen, als visuelles Signal für den Benutzer. Zum Beispiel das Bild soll kurz "aufblinken" oder eben mein erster Ansatz der Hintergrund soll sich während der Mouseover-Zeit ändern.

Vielleicht ist es nun klarer, was ich bezwecken will. Bin für jeden anderen Lösungsweg dankbar.

Verfasst: 29. Oktober 2008 09:07
von jerry42
hat niemand eine Idee?

Verfasst: 29. Oktober 2008 09:23
von upsala
Ich habe es jetzt nicht getestet, aber so müßte es funktionieren:

QItemDelegate ableiten und paint() überladen. Mit QStyleOptionViewItem bekommst du auch QStyleOption::state geliefert. Und da gibt es unter anderem den Wert QStyle::State_MouseOver.

Verfasst: 29. Oktober 2008 10:14
von jerry42
danke für den Tipp.

Kann ich denn das QItemDelegate auch für das QTableWidget ableiten?
Oder muss ich dann überwechseln zur QTableView?

Verfasst: 29. Oktober 2008 12:49
von upsala
Ein QTableWidget ist doch auch eine QTableView...

Verfasst: 29. Oktober 2008 13:22
von jerry42
da hast Du natürlich recht, danke :)

ich hab nun versucht es wie von Dir vorgeschlagen umzusetzen. Doch ich hab wohl noch irgendwo nen Denkfehler drin.

Ich habe eine neue Klasse "MyItemDelegate" und die von "QItemDelegate" abgeleitet.

Code: Alles auswählen

/*

#include "MyItemDelegate.h"

MyItemDelegate::MyItemDelegate(QObject * parent) :  QItemDelegate (parent)
{
}

MyItemDelegate::~MyItemDelegate()
{
}


void MyItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & vi, const QModelIndex & mi ){

QItemDelegate::paint(painter, vi, mi);
if(vi.state == QStyle::State_MouseOver) {
  qDebug() << "paintMethode MO";
} else {
  qDebug() << "not MO";
}
}
Zusätzlich habe ich in meiner von QTableWidget abgeleiteten Klasse im Konstruktor das Delegate gesetzt.

Code: Alles auswählen

	setItemDelegate(new MyItemDelegate());
Doch leider bekomme ich weder vom if, noch vom else-Statement eine Message in die Konsole.

Vermutlich benutze ich das ganze fundamental falsch.

Vielleicht weiß jemand weiter?
Bzw. wie setze ich dass dann in einen Mouseovereffect um?
Kann ich da zum Beispiel das Icon von meinem QTableWidgetItem beeinflussen, für die Zeit des MouseOver?

Verfasst: 29. Oktober 2008 14:38
von upsala
Das WA_Hover-Attribut muß noch beim Viewport deiner View gesetzt werden

Verfasst: 29. Oktober 2008 14:50
von jerry42
Danke Dir.

Hab nun mit

Code: Alles auswählen

viewport()->setAttribute(Qt::WA_Hover,true);
im Konstruktor von QTableWidget dies gesetzt.
Es hat aber keine Änderung. setze ich es an der falschen Stelle?

Verfasst: 5. November 2008 10:58
von jerry42
Hab es nun mehr oder weniger gelöst. Vielleicht ist es für jemanden interessant.

Hab das ganze nun durch überschreiben der protected Methode "void mouseMoveEvent ( QMouseEvent * event ) ;" gelöst.
Dort kann ich einfach die aktuelle Position mit meiner Tabelle abgleichen, ob dort ein Item verfügbar ist. Wenn ja highlighte ich es entsprechend.
Sobald ich ein anderes oder kein Item zurückbekomme, setze ich das bisherige Highlight wieder zurück.

Performanz Probleme habe ich bisher zumindest damit nicht.