【问题标题】:Make Qlabel clickable or double clickable in Qt在 Qt 中使 Qlabel 可单击或可双击
【发布时间】:2017-12-10 06:57:34
【问题描述】:

我是 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,并且我已将 void on_label_click() 添加到私有插槽下的 mainwindow.h,但什么也没发生。

【问题讨论】:

标签: c++ qt mouseevent qlabel


【解决方案1】:

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

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

  1. 在表单中添加QLabel

  2. 右键单击添加的标签并选择Promote to...

  3. 输入您的可点击标注分类名称及其头文件名

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

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

【讨论】:

  • 谢谢!但是对于最后一步,如果我想要现有的标签可点击,我需要在我的新 clickablelabel.cpp 中写入 writr ui->label 吗?我该怎么办?很抱歉问得这么详细,我真的是Qt的初学者
  • 在clickablelabel.cpp中有你的可点击标签类的代码,它与现有的普通QLabel无关。您在某处有现有标签(我想在您的主窗口中),这就是您需要提升标签的地方(如果它是在设计器中创建的)或将 QLabel 更改为 ClickableLabel 如果它是在代码中动态创建的(在这种情况下不要'不要忘记在主窗口头文件中包含 clickablelabel.h)
  • 是的,现有的 Qlabel 在我的 ui 表单和我的主窗口中,但如何使其工作?例如,如果我想在单击标签时显示第二个对话框?我在哪里以及如何编写代码?我只是不知道写代码的结构
  • 您应该实现一个函数并将其连接到可循环标签信号pressed(或clicked 或任何您所称的)。创建对话框可能应该在主窗口类中实现
  • 好的,我想我明白了,明天我试试,谢谢。如果有效,我会接受你的回答
【解决方案2】:

您可以改用QPushButton,但如果您迫切需要QLabel,您可以这样做:

可点击的.h

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

可点击的.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
  • 你不能将标签连接到任何东西,你只能连接信号
  • 你有完整的例子吗?没看懂
  • @jycjo 我已经用部分代码更新了答案。不幸的是我不能在那里添加我所有的代码。我希望这会有所帮助
猜你喜欢
  • 2018-01-16
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2023-04-08
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多