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
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript