在Qt

时间:2017-07-06 10:11:51

标签: c++ qt mouseevent qlabel

我是Qt的初学者,现在我想让我的标签可点击,我在网上搜索了这么多,但是没有人给出我们如何制作它的真实例子。有人可以一步一步地教我吗?现在我的基本思路是分别创建一个新的.c文件和新的.h文件,然后将它们包含在我的mainwindow.c中,然后将它与ui形式的现有标签连接起来。这些是我试图做的,但不能成功。希望有人可以教导并更好地将步骤图片放在命令中,谢谢。 这是clicklabel.h代码:

#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并且我在私有插槽下的mainwindow.h中添加了void on_label_click(),但没有任何反应。

2 个答案:

答案 0 :(得分:5)

创建一个派生自QLabel的新类,重新实现mousePressEvent以发出自定义pressed()信号(或您需要的任何其他功能)

如果您需要在ui文件中使用可点击标签,请按以下步骤操作:

  1. QLabel添加到表单

  2. 右键点击添加的标签,然后选择Promote to...

  3. 输入您的可点击标签类名称及其标题文件名

  4. 按添加,然后在树中选择标签,然后选择promote

  5. enter image description here

    enter image description here

    现在您可以使用您的子类标签(本教程实际上适用于任何子类窗口小部件)作为使用ui->的任何QWidget

答案 1 :(得分: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();
}

更新: 我在源代码中使用的这个实现。我不能过去补充代码,但这是我使用它的部分。 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()));
...