在Qt中使Qlabel可点击或双击

7

我是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 中的 private slots 下添加了 void on_label_click(),但什么也没发生。

2
在我的一个回答中,我创建了一个带有mousePressEvent()的派生QLabel。更新:这与@zapredelom建议的非常相似。 - Scheff's Cat
2个回答

7
创建一个继承自QLabel的新类,重新实现mousePressEvent以发出自定义的pressed()信号(或您需要的任何其他功能)。
如果您需要在ui文件中使用可点击的标签,请按照以下步骤操作:
  1. QLabel添加到表单中
  2. 右键单击添加的标签,选择Promote to...
  3. 输入您的可点击标签类名称及其头文件名称
  4. 按添加按钮,然后在树中选择您的标签并选择promote

enter image description here

enter image description here

现在,您可以像使用任何QWidget一样使用您的子类化标签(实际上,此教程适用于任何子类化小部件)。

是的,现有的QLabel在我的UI表单和主窗口中,但是如何让它工作呢?例如,如果我想通过单击标签来显示第二个对话框,我应该在哪里以及如何编写代码?我只是不知道编写代码的结构。 - innocent boy
你应该实现一个函数,将其连接到可点击标签信号“pressed”(或“clicked”或任何你命名的名称)。创建对话框应该在主窗口类中实现。 - Bearded Beaver
好的,我明白了,明天我会尝试一下,谢谢。如果有效,我会接受你的答案。 - innocent boy
抱歉,我又失败了,你能否给我一个完整的例子呢?这个例子应该包括所有的代码,如新的.c文件和新的.h文件,并且使标签可点击,在我点击标签后,我可以收到一个信息框。你能教我吗?非常抱歉我太蠢了,无法完成它。 - innocent boy
我刚为您完成了这个项目。 - Bearded Beaver
显示剩余8条评论

3
您可以使用QPushButton代替,但如果您非常需要QLabel,可以这样做:

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

只需在源代码中将类型从qlabel更改为Clickable即可。 - zapredelom
你不能将标签连接到任何东西,你只能连接信号。 - Bearded Beaver
你有完整的例子吗?我不理解它。 - innocent boy
@jycjo 我已经更新了答案,加上了一些代码片段。不幸的是,我无法把所有的代码都添加在那里。希望这会有所帮助。 - zapredelom
我看你把信号连接到了同一个函数的 on_label_clicked 上,是吗?如果是,那就有一个问题。你需要在第一个信号被发出之前设置好信号/槽连接(通常是在可点击标签创建时)。 - zapredelom
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接