2017-07-06 7 views
0

Je suis débutant en Qt, maintenant je veux rendre mon label cliquable, j'ai tellement cherché en ligne, mais personne ne me donne un vrai exemple de comment ils l'ont fait. Alors quelqu'un peut-il m'apprendre pas à pas? Maintenant, mon idée de base est de créer un nouveau fichier .c et un nouveau fichier .h respectivement, puis de les inclure dans mon mainwindow.c, puis de le connecter avec l'étiquette existante sous forme d'ui. C'est ce que j'essayais de faire, mais je ne peux pas le faire. J'espère que quelqu'un peut enseigner et mieux mettre l'image de l'étape dans la commande, merci. Voici le code clicklabel.h:Rendre Qlabel cliquable ou double cliquable en Qt

#ifndef CLICKEDLABEL_H 
#define CLICKEDLABEL_H 

#include <QWidget> 
#include <QLabel> 

class ClickedLabel : public QLabel 
{ 
    Q_OBJECT 
public: 
    ClickedLabel(QWidget *parent=0): QLabel(parent){} 
    ~ClickedLabel() {} 
signals: 
    void clicked(ClickedLabel* click); 
protected: 
    void mouseReleaseEvent(QMouseEvent*); 
}; 

#endif // CLICKEDLABEL_H 

Ce code clicklabel.c:

#include "clicklabel.h" 
void ClickedLabel::mouseReleaseEvent(QMouseEvent *) 
{ 
    emit clicked(this); 
} 

Ce sont ce que j'ai ajouté dans mon mainwindow.c (le nom de l'étiquette est click_test):

void data_labeling::on_label_clicked() 
{ 
    QString path="/home/j/Pictures/images.jpeg"; 
    QPixmap cat(path); 
    connect(ui->click_test, SIGNAL(clicked()), this, 
SLOT(on_label_clicked())); 
    ui->click_test->setPixmap(cat); 
    ui->click_test->resize(cat.width(),cat.height()); 

} 

Bien sûr, je l'ai encouragé à clicklabel.h et aussi j'ai ajouté on_label_click void() à mon mainwindow.h sous fentes privées, mais rien ne se passe.

+2

Dans une de mes réponses j'ai fait un [dérivé QLabel] avec 'mousePressEvent()'] (https://stackoverflow.com/a/44451423/7478597). Mise à jour: Il est assez similaire, comme suggéré par @zapredelom. – Scheff

Répondre

0

Créer une nouvelle classe dérivée de QLabel, réimplémentez mousePressEvent pour émettre le signal pressed() sur mesure (ou toute autre fonctionnalité dont vous avez besoin)

Si vous devez utiliser votre cliquable étiquette dans les fichiers ui, procédez comme suit:

  1. Ajouter QLabel à la forme

  2. Faites un clic droit sur l'étiquette ajoutée et sélectionnez Promote to...

  3. Entrez votre cliquable nom de la classe de l'étiquette et son nom de fichier d'en-tête

  4. ajouter presse, que de sélectionner votre étiquette dans l'arborescence et sélectionnez promote

enter image description here

enter image description here

Maintenant vous pouvez utiliser votre label sous-classé (ce tutoriel fonctionne réellement pour n'importe quel widget sous-classé) comme n'importe quel QWidget utilisant ui->

+0

merci! mais pour la dernière étape, si je veux cliquable sur mon label existant, j'ai besoin de writr ui-> label dans mon nouveau clickablelabel.cpp? Et que dois-je faire? donc désolé de demander en détail, je suis vraiment un débutant dans Qt –

+0

Dans clickablelabel.cpp vous avez le code de votre classe d'étiquettes cliquables, il n'a rien à voir avec le «QLabel» ordinaire existant. Vous avez un label existant quelque part (je suppose dans votre fenêtre principale), c'est là que vous devez promouvoir label (si créé dans designer) ou changer QLabel en ClickableLabel s'il est créé dynamiquement dans le code (dans ce cas don ' t oublier d'inclure clickablelabel.h dans le fichier d'en-tête de la fenêtre principale) –

+0

yup, le Qlabel existant est dans mon formulaire d'interface utilisateur et dans ma mainwindow, mais comment le faire fonctionner? Par exemple, si je veux afficher une seconde boîte de dialogue en cliquant sur l'étiquette? où et comment puis-je écrire le code? Je ne connais pas la structure de l'écriture du code –

0

vous pouvez utiliser à la place QPushButton, mais vous avez désespérément besoin qlable, vous pouvez le faire

clickable.h

class Clickable :public QLabel 
    { 
     Q_OBJECT 
      signals : 
     void clicked(); 
    public: 
     void mousePressEvent(QMouseEvent* event); 

     using QLabel::QLabel; 
    }; 

clickable.cpp

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

MISE À JOUR: cette implémentation que j'ai utilisée dans mon code source. Je ne peux pas passer le code compléte, mais voici la partie où je l'ai utilisé. source.h

... 
private: 
    QLabel* label1; 
    QLabel* label2; 
... 

source.cpp ...

label1 = new Clickable("label1 text", this); 
label2 = new Clickable("label2 text", this); 
... 
connect(label1 , SIGNAL(clicked()), this, SLOT(label1clicked())); 
connect(label2 , SIGNAL(clicked()), this, SLOT(label1clicked())); 
... 
+0

oui correct et après l'a fait, comment puis-je rendre mon étiquette existante cliquable? Ai-je besoin de promouvoir mon label existant ou de le connecter à la classe? –

+0

Il suffit de changer le type dans votre source de qlabel à Clickable – zapredelom

+0

vous ne pouvez pas connecter l'étiquette à quoi que ce soit, vous pouvez simplement connecter des signaux –