Qt 使用QLabel的派生类实现QLabel的双击响应

1 介绍

在QLabel中没有双击等事件响应,需要构建其派生类 ,自定义信号(signals) 、重载事件函数(event) ,最后在Qwidget中使用connect链接即可,进而实现响应功能。

对于其余没有需求事件响应的QObject同样适用。

此外,该功能同样可以使用事件过滤器 ,将QLable所需的双击事件功能委托给其它QObjectQWidget来处理

2 过程

2.1 构建派生类

2.2 自定义信号,重载事件函数

信号doubleClicked、 与mouseDoubleClickEvent声明:

与mouseDoubleClickEvent定义:

注:信号doubleClicked在Qt中有内置定义,不需要重载

2.3 QWidget中的connect链接

3 代码

tmylabel.h

cpp 复制代码
#ifndef TMYLABEL_H
#define TMYLABEL_H

#include <QLabel>
#include <QObject>
#include <QMainWindow>

class TMyLabel : public QLabel
{
    Q_OBJECT
public:
    TMyLabel(QWidget *parent = nullptr);
signals:
    void doubleClicked();


    // QWidget interface
protected:
    virtual void mouseDoubleClickEvent(QMouseEvent *event) override;

    // QObject interface
public:
    virtual bool event(QEvent *event) override;
};





#endif // TMYLABEL_H

tmylabel.cpp

cpp 复制代码
#include "tmylabel.h"
#include <QEvent>
TMyLabel::TMyLabel(QWidget *parent):QLabel(parent)
{
    setAttribute(Qt::WA_Hover, true);
}

void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    emit doubleClicked();
}


bool TMyLabel::event(QEvent *event)
{
    if(event->type() == QEvent::HoverEnter)
    {
        QPalette palette = this->palette();
        palette.setColor(QPalette::WindowText, Qt::red);
        setPalette(palette);
    }
    else if(event->type() == QEvent::HoverLeave)
    {
        QPalette palette = this->palette();
        palette.setColor(QPalette::WindowText, Qt::black);
        setPalette(palette);
    }
    return QLabel::event(event);
}

mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->label, &TMyLabel::doubleClicked, this, &MainWindow::do_double_clicked);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::do_double_clicked()
{
    ui->label->setText("label被双击,自定义信号槽响应");
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    ui->label->setText("窗口被双击");
    ui->label->adjustSize();
}

mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void do_double_clicked();

private:
    Ui::MainWindow *ui;

    // QWidget interface
protected:
    virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
};


#endif // MAINWINDOW_H
相关推荐
勇敢牛牛_20 分钟前
使用Rust实现服务配置/注册中心
开发语言·后端·rust·注册中心·配置中心
catchadmin20 分钟前
PHP serialize 序列化完全指南
android·开发语言·php
hzzzzzo038 分钟前
微服务网关全解析:从入门到实践
java·开发语言·微服务
slandarer1 小时前
MATLAB | 这是屎吗?抱歉打错了,这是什么?
开发语言·matlab
We....1 小时前
Java多线程分块下载文件
java·开发语言
doll ~CJ1 小时前
基于QVTKOpenGLNativeWidget的三维点云可视化实现
c++·qt·软件开发·三维点云可视化
Pluchon1 小时前
硅基计划3.0 Map类&Set类
java·开发语言·数据结构·算法·哈希算法·散列表
42fourtytoo2 小时前
天津大学智算2026预推免机试第二批题目及代码c++
开发语言·c++·面试
七夜zippoe2 小时前
缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(一)
java·开发语言·缓存
almighty272 小时前
C#WPF控制USB摄像头参数:曝光、白平衡等高级设置完全指南
开发语言·c#·wpf·usb相机·参数设置