QLabel中添加点击事件有三种方式,分别是

  • 使用LinkActivated信号连接槽函数(有缺限)
  • 注册事件分发器eventFilter
  • 创建类重写鼠标事件

1. 使用LinkActivated信号

QLabel类中有LinkActivated信号,是当标签中的链接被点击的时候触发,所以我们可以通过连接LinkActivated信号到槽函数,在里面处理自定义逻辑。

#include <QApplication>
#include <QLabel>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建 QLabel 实例
    QLabel *label2 = new QLabel();
    label2->setText("<a href='#'>点击这里</a>"); // 设置文本为链接
    label2->setOpenExternalLinks(false); // 防止打开浏览器
    label2->setTextInteractionFlags(Qt::TextBrowserInteraction); // 允许文本交互

    // 连接 QLabel 的 linkActivated 信号到 lambda 表达式
    QObject::connect(label2, &QLabel::linkActivated, [=]() {
        qDebug() << "Label2被点击啦";
    });

    label2->show(); // 显示 QLabel

    return app.exec();
}

2. 注册事件分发器

  1. 在任意类中重写protected限定函数bool eventFilter(QObject *obj, QEvent *event) override,不过一般在你想处理的标签组件的父窗口中重写
  2. 然后给想要处理点击逻辑的QLabel使用installEventFilter(重写类的指针)函数注册点击事件
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QEvent>
#include <QMouseEvent>
#include "mylabel.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    int i = 0;
    // 在类中重写eventFilter方法,然后在需要的控件中注册
    bool eventFilter(QObject *obj, QEvent *event) override {

        if (event->type() == QEvent::MouseButtonPress) {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            if (mouseEvent->button() == Qt::LeftButton) {
                // 发生点击事件时执行的操作
                qDebug() << "QLabel was clicked!" << ++i;
                // 返回 true 表示事件已被处理,不再传递
                return true;
            }
            else if (mouseEvent->button() == Qt::RightButton){
                // 右键点击,取消注册
                obj->removeEventFilter(this);
                return true;
            }
        }
        // 其他事件传递给父类处理
        return QObject::eventFilter(obj, event);
    }

private:
    Ui::Widget *ui;



};
#endif // WIDGET_H
QLabel* label = new QLabel(this);
label->installEventFilter(this);

3. 重写鼠标事件

3.1 Qt中的鼠标事件

Qt 是一个跨平台的 C++ 框架,用于开发具有图形用户界面的应用程序。在 Qt 中,处理鼠标事件是 GUI 编程中的一个常见任务。Qt 提供了几种鼠标事件,以下是三种主要的鼠标事件:

  1. QMouseEvent
    这是所有鼠标事件的基类,提供了鼠标事件的基本信息,如事件发生的位置、鼠标按钮的状态、鼠标点击的次数等。QMouseEvent 包含以下重要的成员函数:

    • pos():返回鼠标事件的位置(相对于事件接收者的坐标)。
    • globalPos():返回鼠标事件的全局位置(相对于屏幕的坐标)。
    • button():返回按下的鼠标按钮。
    • buttons():返回当前按下的所有鼠标按钮。
    • modifiers():返回与鼠标事件一起按下的修饰键(如 Ctrl、Shift 等)。
  2. QMousePressEvent
    当用户按下鼠标按钮时,会发出这个事件。它继承自 QMouseEvent,因此包含了 QMouseEvent 的所有信息,并且增加了以下成员函数:

    • isAccepted():检查事件是否被接受处理。
    • accept():接受事件,阻止它被进一步传递。
    • ignore():忽略事件,允许它被传递给父对象。
  3. QMouseReleaseEvent
    当用户释放鼠标按钮时,会发出这个事件。它同样继承自 QMouseEvent,并且提供了与 QMousePressEvent 类似的功能。

  4. QMouseMoveEvent
    当鼠标在窗口内移动时,会发出这个事件。它也继承自 QMouseEvent,并且包含了鼠标移动时的位置信息。QMouseMoveEvent 的成员函数包括:

    • isAccepted():检查事件是否被接受处理。
    • accept():接受事件,阻止它被进一步传递。
    • ignore():忽略事件,允许它被传递给父对象。

除了这些,Qt 还提供了其他与鼠标相关的事件,如 QWheelEvent(处理鼠标滚轮事件)和 QContextMenuEvent(处理右键点击弹出上下文菜单的事件)。这些事件可以帮助开发者实现丰富的交互功能。开发者可以通过重写 QWidget(或其他 Qt 控件)的事件处理函数(如 mousePressEvent()mouseReleaseEvent()mouseMoveEvent())来响应这些事件。

3.2 自定义逻辑

可以通过重写自定义类的鼠标事件来进行自定义逻辑,三种具体的鼠标事件的声明如下:

  • void mousePressEvent(QMouseEvent *event) override;
  • void mouseReleaseEvent(QMouseEvent *event) override;
  • void mouseMoveEvent(QMouseEvent *event) override;
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H

#include <QObject>
#include <QLabel>
#include <QEvent>
#include <QMouseEvent>
class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent *event) override;

signals:
};

#endif // MYLABEL_H
mylabel.cpp
#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent)
    : QLabel{parent}
{
    this->setText("我是自定义Label标签");
    this->setStyleSheet("background : pink");
}

void MyLabel::mousePressEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        qDebug() << "MyLabel was clicked";
    }
    QLabel::mousePressEvent(event); // 调用基类的 mousePressEvent 方法
}