2017-07-06 393 views
0

我是Qt的初學者,現在我想讓我的標籤可點擊,我在網上搜索了很多,但沒有人給我一個他們是如何做到的真實例子。那麼有人可以一步步教我嗎?現在我的基本思想是分別創建一個新的.c文件和新的.h文件,然後將它們包含到我的mainwindow.c中,然後以ui格式將其與現有標籤連接起來。這些是我想要做的,但不能做到。希望有人能教,並更好地把步驟圖片放在命令中,謝謝。 這裏是clicklabel.h代碼:Qlabel可點擊或雙擊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 

這個clicklabel.c代碼:

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

這些是我加入到我的mainwindow.c(標籤的名稱是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()); 

} 

當然我也促進了它clicklabel.h也是我一直在私有槽添加無效on_label_click()我mainwindow.h,但什麼都沒有發生。

+2

在我的答案中的一個使用你的子類的標籤(本教程其實適用於任何控件子類),我做了一個[衍生'QLabel'用'mousePressEvent()'](HTTPS:/ /stackoverflow.com/a/44451423/7478597)。更新:它與@zapredelom建議的非常相似。 – Scheff

回答

0

創建一個從QLabel衍生一個新的類,重新實現mousePressEvent發出定製pressed()信號(或者你需要的任何其他功能)

如果您需要使用您可點擊標籤中的UI文件,請按照下列步驟操作:

  1. 添加QLabel到窗體

  2. 右擊添加標籤和選擇Promote to...

  3. 輸入您可點擊標籤類的名稱和它的頭文件名

  4. 按添加,比在樹中選擇您的標籤,然後選擇promote

enter image description here

enter image description here

現在你可以爲任何QWidget的使用ui->

+0

謝謝!但是對於最後一步,如果我想要現有的標籤可點擊,我需要在我的新clickablelabel.cpp中使用writr ui-> label。我該怎麼做?所以很抱歉問詳細,我真的是一個初學者在Qt –

+0

在clickablelabel.cpp你有你的可點擊標籤類的代碼,它與現有的普通'QLabel'沒有關係。如果在代碼中動態創建了''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''我有一個標籤(我想在你的主窗口中),這就是你需要促進標籤的地方t忘記在主窗口頭文件中包含clickablelabel.h) –

+0

yup,現有的Qlabel以我的UI格式和我的主窗口中,但如何使它工作?例如,如果我想顯示第二個對話框點擊標籤?在哪裏以及如何編寫代碼?我只是不知道編寫代碼的結構 –

0

,您可以改用qpushbutton, 但你迫切需要qlable,你可以做到這一點

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(); 
} 

UPDATE: 這我在源代碼中使用的實現。我不能完成代碼,但這裏是我使用它的部分。 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

是的,在做完之後,我如何讓現有的標籤可點擊?我是否需要宣傳現有的標籤或將其連接到班級? –

+0

只需將源文件中的類型從qlabel更改爲可點擊 – zapredelom

+0

您無法將標籤連接到任何內容,只需連接信號 –