效果
效果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(),处理其他类型事件
}