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
相关推荐
万粉变现经纪人15 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒15 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼15 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
小郑加油16 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦16 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp16 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy17 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode17 小时前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶
iCxhust17 小时前
微机原理实践教程(C语言篇)---A001闪烁灯
c语言·开发语言·汇编·单片机·嵌入式硬件·51单片机·微机原理
MATLAB代码顾问18 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法