[gelöst] QTW: Gegenstück zu cellEntered/itemEntered-Signal
[gelöst] QTW: Gegenstück zu cellEntered/itemEntered-Signal
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
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.
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.
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.
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.
Zusätzlich habe ich in meiner von QTableWidget abgeleiteten Klasse im Konstruktor das Delegate gesetzt.
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?
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";
}
}
Code: Alles auswählen
setItemDelegate(new MyItemDelegate());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?
Danke Dir.
Hab nun mit
im Konstruktor von QTableWidget dies gesetzt.
Es hat aber keine Änderung. setze ich es an der falschen Stelle?
Hab nun mit
Code: Alles auswählen
viewport()->setAttribute(Qt::WA_Hover,true);Es hat aber keine Änderung. setze ich es an der falschen Stelle?
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.
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.