《QT6/C++开发指南》6事件处理/事件与信号/示例6-2

效果

效果1:鼠标悬浮,字体变红变大
效果2:双击触发槽函数

在这里插入图片描述

代码


自定义信号与槽结构图

widget.h

在这里插入图片描述

#ifndef TMYLABEL_H
#define TMYLABEL_H

#include <QLabel>
#include <QObject>
//#include <QQmlEngine>

class TMyLabel : public QLabel
{
    //QML_ELEMENT
    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

widget .cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->lab,SIGNAL(doubleClicked()),
            this,SLOT(do_doubleClick()));
}

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

//双击窗口时的响应
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    ui->lab->setText("窗口被双击了");
    ui->lab->adjustSize();
}

//实现自定义信号:双击标签时的响应
void Widget::do_doubleClick()
{
    ui->lab->setText("信号的槽函数响应");
    ui->lab->adjustSize();
}

关联

在这里插入图片描述
在这里插入图片描述

tmylabel.h

在这里插入图片描述

#ifndef TMYLABEL_H
#define TMYLABEL_H
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1b08c929b40e4778876fc80646209a56.png)

#include <QLabel>
#include <QObject>
//#include <QQmlEngine>

class TMyLabel : public QLabel
{
    //QML_ELEMENT
    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

#include "tmylabel.h"
#include <QEvent>

TMyLabel::TMyLabel(QWidget *parent):QLabel(parent)
{
    this->setAttribute(Qt::WA_Hover,true);  //必须设置这个属性,才能产生hover事件
}


void TMyLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
    Q_UNUSED(event);
    emit doubleClicked();   //发射信号
}



bool TMyLabel::event(QEvent *e)
{
    if(e->type() ==QEvent::HoverEnter)      //鼠标移入
    {
        QPalette plet=this->palette(); // 拿到调色板
        plet.setColor(QPalette::WindowText, Qt::red);
        this->setPalette(plet);

        QFont font = this->font();
        font.setPointSize(font.pointSize() + 20); // Increase font size by 2 points
        this->setFont(font);
    }
    else if (e->type()==QEvent::HoverLeave) //鼠标移出
    {
        QPalette plet=this->palette();
        plet.setColor(QPalette::WindowText, Qt::black);
        this->setPalette(plet);

        QFont font = this->font();
        font.setPointSize(font.pointSize() - 20); // Restore original font size
        this->setFont(font);
    }

    return QLabel::event(e);    //执行父类的event(),处理其他类型事件
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值