qLabel klickbar machen

Alles rund um die Programmierung mit Qt
Antworten
puppetClon
Beiträge: 16
Registriert: 30. Oktober 2014 18:53

qLabel klickbar machen

Beitrag von puppetClon »

Guten Tag,

ich bräuchte eure Hilfe, ich habe hier ein Problem, bei dem ich ziemlich auf dem Schlauch stehe.

Ausgangslage
Ich habe meine Oberfläche mit dem Designer gestaltet und anstatt ein paar Buttons habe ich 3 QLabel mit Pixmaps gefüllt. Diese Bilder sollen nun
klickbar gestaltet werden. Ich weiß das QLabel kein clicked() Event besitzt und ich deshalb eine subclass erstellen muss.

Vorgehensweiße
Anbei meine Subclass

CLICKABLELABEL_H

Code: Alles auswählen

#ifndef CLICKABLELABEL_H
#define CLICKABLELABEL_H

#include <QObject>
#include <QLabel>

class ClickableLabel : public QLabel
{
Q_OBJECT
public:
    explicit ClickableLabel( const QString& text="", QWidget* parent=0 );
    ~ClickableLabel();
signals:
    void clicked();
protected:
    void mousePressEvent(QMouseEvent* event);
};
#endif // CLICKABLELABEL_H
CLICKABLELABEL_CPP

Code: Alles auswählen

#include "clickablelabel.h"

ClickableLabel::ClickableLabel(const QString& text, QWidget* parent)
    : QLabel(parent)
{
    setText(text);
}

ClickableLabel::~ClickableLabel()
{
}

void ClickableLabel::mousePressEvent(QMouseEvent* event)
{
    emit clicked();
}

Nun möchte ich in meiner mainwindow.cpp connects einrichten, damit beim anklicken eine bestimmte Funktion ausgeführt wird.
MAINWINDOW.H

Code: Alles auswählen

   ClickableLabel          *mLabel;
MAINWINDOW.CPP

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    mLabel = new ClickableLabel();
}
Hier weiß ich nun nicht, wie ich mein QLabel -> Beispiel ui->homeLabel so connecte, dass es beim klicken eine Funktion innerhalb der mainwindow ausführt.


Ich hoffe mein Problem ist verständlich und es gibt hier ein paar freundliche Menschen, die mir unter die Arme greifen.

Mit freundlichem Gruß
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: qLabel klickbar machen

Beitrag von archer »

Du legst in deinem MainWindow einen SLOT an, z.B.

Code: Alles auswählen

public slots:
    void onLabelClicked();
Wenn du dein Label erzeugt hast:

Code: Alles auswählen

mLabel = new ClickableLabel();
connect(mLabel, SIGNAL(clicked()), this, SLOT(onLabelClicked()));
Schau die dazu nochmal die Dokumentation an. Evtl. wäre auch das Thema QObject::eventFilter interessant für dich.
puppetClon
Beiträge: 16
Registriert: 30. Oktober 2014 18:53

Re: qLabel klickbar machen

Beitrag von puppetClon »

Vielen Dank für den Denkanstoß.

Ich werde mir das ganze mal anschauen und bei auftretenden Problemen Rückmeldung geben.


edit:

Was ich gerade bei der Antwort von Ihnen sehe...durch das connect wurde ja das clicked() Signal aus meiner Subclass mit dem Slot aus der Mainwindows connected....das war mir bewusst.....was mir fehlt oder wo ich gerade keinen Ansatz habe ist folgendes....


Ich greife ja folgendermaßen auf ein Label zu

connect(ui->homeLabel, SIGNAL(...).....)

Und hier müsste ja nun mit meiner Subclass Funktion verbunden werden (damit bewusst wird, was beim klicken auf welches Label passiert) und dann eben die von Ihnen genannte Weiterleitung.


Ist gerade auf die schnelle etwas blöd formuliert, aber ich hoffe Sie verstehen was ich meine
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: qLabel klickbar machen

Beitrag von archer »

Ich verstehe nicht genau das Problem.
Wurde die Oberfläche mit QLabel oder mit ClickableLabel erstellt?
Das mLabel ist ja so wie du es angegeben hast nicht in der Oberfläche.


Wenn du ein connect ausführst:

Code: Alles auswählen

connect(ui->homeLabel, SIGNAL(clicked()), this, SLOT(onLabelClicked()));
ist die Verbindung doch klar. Ein Klick auf genau diese Label führt die Methode
onLabelClicked() aus.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: qLabel klickbar machen

Beitrag von RHBaum »

Du willst also im Designer dein Layout erstellen, was heisst, das der Designer statt nem "normalen" QLabel irgendwo dein "Spezial" QLabel verwenden soll, richtig ?

Wenn das die Frage ist, dann im Designer unter Benutzerdefinierte Klassen ...
Einen Eintrag festlegen mit BasisKlasse QLabel, und deinem Klassennamen /Header
"Globales Include" bewirkt das der Header mit #include <> statt #include "" eingebunden wird ....

Dann dein Bild als QLabel einfügen und benamsen ....
dann "Als Platzhalter für Benutzerdefinierte Klasse" festlegen und da deinen eintrag anwählen ...

und voiala dein ui->homeLabel ist dann kein QLabel * mehr , sondern ein ClickableLabel * und du kannst es entsprechend connecten ...
Antworten