[Qt] QLabel - click()



  • Hallo,
    kann jemand hier im Forum mir und auch anderen Neueinstegern helfen, und
    einen How to für das erstellen von eigenen Klassen, z.B. für das QLabel,
    schreiben?
    Habe schon gegoogelt, aber nichts wirklich passendes Gefunden...
    http://www.qtcentre.org/threads/8355-QLabel-clicked%28%29
    http://de.wikibooks.org/wiki/Qt_f%C3%BCr_C%2B%2B_Anf%C3%A4nger:_Aufteilung_des_Quellcodes
    Also der zweite Link ist meiner Meinung nach ziemlich gut, aber ich schaffe es trotz dem nicht das Signal click() für mein neues QLabel zu definieren.

    IgelHaut



  • Lies dir doch mal die Doku zu Qt durch, da gibts auch Tutorials.



  • Das clicked()-Signal gibts bei einem QLabel nicht. Das musst du dir selber basteln. Ein clicked() resultiert aus einem mousePressEvent() gefolgt von einem mouseReleaseEvent().
    Das könnte dann z.B. so ausschauen:
    label.h

    #ifndef CLICKABLE_LABEL
    #define CLICKABLE_LABEL
    
    #include <QLabel>
    #include <QMouseEvent>
    
    class ClickableLabel : public QLabel
    {
        Q_OBJECT
        bool pressed;
    
        void mousePressEvent(QMouseEvent*) {
            pressed = true;
        }
        void mouseReleaseEvent(QMouseEvent* e) {
            if(pressed && rect().contains(e->pos())) {
                emit clicked();
            }
            pressed = false;
        }
    
    public:
        ClickableLabel(QWidget* parent=0)
         : QLabel(parent), pressed(false)
        {}
    
    signals:
        void clicked();
    };
    
    #endif
    

    Verwendung:
    win.h

    #ifndef MY_WIN_H
    #define MY_WIN_H
    
    #include <QWidget>
    #include <QDebug>
    #include <QHBoxLayout>
    
    #include "label.h"
    
    class Win : public QWidget
    {
        Q_OBJECT
    private slots:
        void onClick() {
            qDebug() << "Click";
        }
    public:
        Win() {
            ClickableLabel* l = new ClickableLabel(this);
            connect(l, SIGNAL(clicked()), SLOT(onClick()));
            QHBoxLayout* layout = new QHBoxLayout(this);
            layout->addWidget(l);
        }
    };
    
    #endif
    

    main.cpp

    #include <QApplication>
    #include "win.h"
    
    int main(int argc, char** argv)
    {
        QApplication app(argc, argv);
        Win win;
        win.show();
        return app.exec();
    }
    


  • So, ich habe es geschaft, und zwar so:

    myLabel.h :

    #ifndef MYLABEL_H
    #define MYLABEL_H
    
    #include <QLabel>
    #include <QMouseEvent>
    
    class myLabel : public QLabel
    {
            Q_OBJECT
    public:
            myLabel(QWidget* parent = 0);
            ~myLabel(){}
    
    signals:
            void clicked();
    
    public slots:
            void slotClicked();
    
    protected:
            void mousePressEvent(QMouseEvent* event);
    };
    
    #endif // MYLABEL_H
    

    myLabel.cpp :

    #include "myLabel.h"
    
    myLabel::myLabel(QWidget* parent) : QLabel(parent)
    {
    	connect(this, SIGNAL(clicked()), this, SLOT(slotClicked()));
    }
    
    void myLabel::slotClicked()
    {
    }
    
    void myLabel::mousePressEvent(QMouseEvent* event)
    {
    	emit clicked();
    }
    

    Dann einfach die beiden Dateien in Qt-Creator importieren und auf die
    Ui des Fensters clicken.
    Ein QLabel setzen, Rechtsclick auf das QLabel und da die Option
    "Benutzerdefiniere Klassen" auswählen.
    Es hat sich nun ein Fenster geöffnet, in diesem die Basisklasse "QLabel"
    auswählen, bei Klassenname "myLabel" angeben und bei Include-Datei "myLabel.h".
    Auf Hinzufügen und dann auf Anwenden clicken. Als nächstes die
    "Signale und Slots ändern", bei Slots den Slot "slotClicked()" hinzufügen und
    bei Signalen das "clicked()" Signal.
    Nun kann man wie bei den Button Rechtsclick auf das myLabel machen und auf
    "Slot anzeigen" gehen. Da den Slot "clicked()" auswählen und auf ok clicken.

    IgelHaut



  • @l'abra d'or Wozu pressed merken? Wenn eine Release kommt muß doch vorher der Button gedrückt worden sein.



  • Tyrdal schrieb:

    @l'abra d'or Wozu pressed merken? Wenn eine Release kommt muß doch vorher der Button gedrückt worden sein.

    Weil ich davon ausgegangen bin, dass das Widget auch ein releaseEvent bekommt, wenn das pressEvent über einem anderen Widget war - aber scheinbar hab ich mich da geirrt 😃
    Habs ausprobiert, und jedenfalls unter Linux kommt das releaseEvent auch auf dem Widget, welches das pressEvent bekommen hat, egal ob man mit der Maus noch drin ist oder nicht.
    Dann wäre es wohl doch intelligenter gewesen, abzufragen ob es die linke Maustaste war, die geklickt hat 😃



  • versuch mal meine Variante, also bei mir funktionniert sie...



  • IgelHaut schrieb:

    versuch mal meine Variante, also bei mir funktionniert sie...

    Deine Variante ist aber kein clicked() sondern ein pressed(). Wie gesagt, clicked ist normalerweise "mousePress auf ein Widget gefolgt von einem mouseRelease auf dem Widget". Wenn jetzt mouseRelease auf dem selben Widget passiert wie das mousePress, dann brauchst du nur mouseReleaseEvent zu implementieren und da das clicked() abfeuern.

    void myLabel::mouseReleaseEvent(QMouseEvent* event)
    {
        if( rect().contains(event->pos() && event->button() == Qt::LeftButton ) {
            emit clicked();
        }
    }
    

    Nur wenn der Release im Bereich des Widgets erfolgt, und es sich um die Linke Maustaste handelt, spricht man von einem "click".


Anmelden zum Antworten