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
相关推荐
虾球xz6 分钟前
CppCon 2018 学习:THE MOST VALUABLE VALUES
开发语言·c++·学习
阿蒙Amon1 小时前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
尘浮7281 小时前
60天python训练计划----day59
开发语言·python
Chef_Chen2 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言
不学会Ⅳ2 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos
好开心啊没烦恼3 小时前
Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?
开发语言·python·数据挖掘·数据分析·pandas
lljss20204 小时前
Python11中创建虚拟环境、安装 TensorFlow
开发语言·python·tensorflow
Python×CATIA工业智造7 小时前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
我叫小白菜8 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄8 小时前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python