[gelöst]Welches QLabel wurde bei mousePressEvent angeklickt?

Alles rund um die Programmierung mit Qt
Antworten
gelignite
Beiträge: 37
Registriert: 6. Dezember 2007 21:23
Kontaktdaten:

[gelöst]Welches QLabel wurde bei mousePressEvent angeklickt?

Beitrag von gelignite »

Hallo,

ich habe die Methode mousePressEvent von QWidget für QLabel überladen. Der Grund dafür ist, dass ich in einem Dialog ein QLabel habe, welchem ich ein QPixmap beliebiger Groesse gebe. Dieses QPixmap wird einheitlich im Format 32x32 dargestellt, soll aber bei einem Klick darauf dieses in voller Größe erscheinen lassen, beispielsweise in 1024x768.

Leider gibt es aber auch noch einige andere QLabel in diesem Dialog, die nun ebenfalls bei einem Klick den Event auslösen und diese Methode aufrufen. Ich suche nun eine Möglichkeit zu bestimmen, welches QLabel angeklickt wurde.

Ich habe bereits folgendes versucht:

Code: Alles auswählen

void QLabel::mousePressEvent( QMouseEvent * event )
{
    MeinDialog::zeigeVolleGroesse( this );
}


void MeinDialog::zeigeVolleGroesse( QLabel * label )
{
    if( label == this->labelPixmap )           // labelPixmap ist das gewünschte QLabel
        qDebug( " korrekt " );
    else
        qDebug( " daneben " );
}
Dies führt zur Compiler-Meldung:
Fehler: Elementfunktion »void MeinDialog::zeigeVolleGroesse(QLabel*)« kann nicht ohne Objekt aufgerufen werden
Meine Fragen noch einmal in Kurzfassung:
- Wie kann ich bestimmen, welches QLabel angeklickt wurde?
- Bin ich mit dieser Strategie eigentlich auf dem richtigen Weg, oder gibt es eine elegantere Lösung mit einem Klick auf ein QPixmap dieses in voller Größe (vorzugsweise in einem eigenen Dialogfenster) dazustellen?

Gruß,
gelignite
Zuletzt geändert von gelignite am 14. Januar 2008 20:36, insgesamt 1-mal geändert.
{brigens ist ein Kezboard/Treiber v;llig [berfl[ssig!
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Natürlich gibt es einfachere Möglichkeiten. Du machst dir das Leben schon sehr schwer.

Lege ein QPixmap auf ein Label und emitte beim QMouseEvent ein Signal, damit kannst du dann dein Label verbinden und auf das Signal reagieren. Und, um das ganze dann noch einen Schritt zu vereinfachen verbindest du alle Labels mit dem gleichen Signal auf den gleichen Slot und über QObject *sender() bekommst du dann das Label, welches das Signal verschickt hat.
gelignite
Beiträge: 37
Registriert: 6. Dezember 2007 21:23
Kontaktdaten:

Beitrag von gelignite »

Hallo,

leider bin ich noch nicht lang genug mit Qt vertraut, um die folgen zu können. :cry:
FlorianBecker hat geschrieben:und emitte beim QMouseEvent ein Signal
Für mich hieße das:

Code: Alles auswählen

void QLabel::mousePressEvent( QMouseEvent * event )
{
    emit labelPressed( this );
}
Das führt aber zu:
Fehler: »labelPressed« wurde in diesem Gültigkeitsbereich nicht definiert
weil es halt mein Signal ist und nicht QLabel's.

Gruß,
gelignite
{brigens ist ein Kezboard/Treiber v;llig [berfl[ssig!
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, sieht doch schon ziemlich gut aus. Den Parameter von this kannst du dir sparen, den bekommst du direkt über QObject *sender() zurück.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich würde sagen - Schau dir die Doku an!
Vor allem die über Signals und Slots
Und auch der Rest deines Problems wird im Tutorial erklärt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gelignite
Beiträge: 37
Registriert: 6. Dezember 2007 21:23
Kontaktdaten:

Beitrag von gelignite »

Hallo,

Signals and Slots hilft mir gar nicht. Entweder versteh ich das dort Beschriebene nicht, oder es trifft nicht mein Problem.

Die darin verwendete Klasse Counter beispielsweise wird von QObject abgeleitet. Dass ich einer abgeleiteten Klasse dann beliebige Attribute, Methoden, Signale, Slots, ... hinzufügen kann, ist mir klar.

Ich verwende aber QLabel und nicht irgendwas von QLabel Abgeleitetes (da der Dialog über den Designer erstellt wurde). QLabel um ein brauchbares Signal zu erweitern dürfte nicht in meiner Macht liegen, oder?

Gruß,
gelignite
{brigens ist ein Kezboard/Treiber v;llig [berfl[ssig!
daniel79
Beiträge: 6
Registriert: 15. Mai 2006 12:01
Wohnort: Saarbrücken

Beitrag von daniel79 »

Wenn Du eine Klasse willst, die prinzipiell das gleiche macht wie QLabel, aber auch noch irgendwas Anderes, bietet es sich ja vll. an eine neue von QLabel abzuleiten. Z.B. eine der man im Konstruktor ein Icon übergibt, das im mousePressEvent als Vollbild dargestellt wird.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag von MichaelS »

QLabel um ein brauchbares Signal zu erweitern dürfte nicht in meiner Macht liegen, oder?
Was hindert Dich daran?
gelignite
Beiträge: 37
Registriert: 6. Dezember 2007 21:23
Kontaktdaten:

Beitrag von gelignite »

Hallo,

ich kenne nun mittlerweile 2 Wege, aber vorher noch schnell ein Dank für die weiteren Antworten.
MichaelS hat geschrieben:
QLabel um ein brauchbares Signal zu erweitern dürfte nicht in meiner Macht liegen, oder?
Was hindert Dich daran?
Mein Wissen, wie dies zu tun wäre. Ich hätte vermutet bzw. vermute noch immer dazu qlabel.cpp und qlabel.h öffnen zu müssen.


Der Vollständigkeit halber hier noch meine beiden Vorschläge, die es tun sollten.
Erstens:

Code: Alles auswählen

void QLabel::mousePressEvent( QMouseEvent * event )
{
    FooBar::zeigeVolleGroesse( objectName() );
}


void FooBar::zeigeVolleGroesse( QString labelClicked )
{
    QString labelNeeded = "labelPixmap";

    if( labelClicked == labelNeeded )
           // do something

}
Alternative:

Code: Alles auswählen

class FooBar : QLabel
{

protected slots:
    void mousePressEvent( QMouseEvent * event );

}
Da ich erst kurz nach meiner hiesigen Anfrage erfahren habe, wie man im Designer auch andere als nur die Standardklassen verwenden kann, habe ich mich letztendlich für die Verwendung einer von QLabel abgeleiteten Klasse entschieden. Die Label, die anklickbar sein sollen, sind dann nun Objekte dieser abgeleiteten Klasse, welcher der entsprechende Slot zur Verfügung steht. Rein aus dem Bauch heraus wäre die erste Idee wohl aber doch die Einfacherere.

Danke nochmal für eure Mithilfe.

Gruß,
gelignite
{brigens ist ein Kezboard/Treiber v;llig [berfl[ssig!
Antworten