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

Alles rund um die Programmierung mit Qt
Antworten
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

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

Beitrag 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
Zuletzt geändert von jerry42 am 5. November 2008 10:59, insgesamt 1-mal geändert.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag von jerry42 »

hat niemand eine Idee?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ein QTableWidget ist doch auch eine QTableView...
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das WA_Hover-Attribut muß noch beim Viewport deiner View gesetzt werden
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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?
jerry42
Beiträge: 126
Registriert: 9. Oktober 2008 10:48

Beitrag 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.
Antworten