Qt中实现悬浮窗口

前言

在做应用软件的时候,经常会用到悬浮窗口。当把鼠标指到某一个控件上时,自动出现一个悬浮窗口。本文就来讲一下悬浮窗口如何实现。本文打算利用label控件和一个只有textedit的widget实现这一功能。
具体描述就是,当把鼠标移动到label上方时,只有一个textEdit的widget会出现,当把鼠标移开时,这个widget会隐藏。

label控件实现

首先,label控件自身没有判断鼠标是否指向的功能,所以需要新建自己的label类,继承自QLabel,然后重载enterEvent和leaveEvent(QEvent * event)函数。然后把label控件提升为这个自己的label类。

继承自QLabel的label类h文件实现:

#ifndef QMYLABEL_H
#define QMYLABEL_H

#include <QObject>
#include <QLabel>

class QMyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit QMyLabel(QWidget *parent = nullptr);

signals:
    void show();
    void hide();

public slots:

private:
    void enterEvent(QEvent * event);
    void leaveEvent(QEvent * event);
};

#endif // QMYLABEL_H

这里大部分代码都是qt自动生成的,除了鼠标事件函数重载这个两个函数和两个信号。

继承自QLabel的label类cpp文件实现:

#include "qmylabel.h"

QMyLabel::QMyLabel(QWidget *parent)
{
    this->setMouseTracking(true);
}

void QMyLabel::enterEvent(QEvent * event)
{
    emit show();
}

void QMyLabel::leaveEvent(QEvent * event)
{
    emit hide();
}

注意:

 this->setMouseTracking(true);

这句话一定要有,是用来开启跟踪鼠标功能的。
还有必须要在鼠标进入和离开事件中发送信号,这里也可以改成一个信号但是有一个bool的参数分别代表显示和隐藏。笔者也曾调试过用一个信号传入不同参数的方式,但并没有实现预期的功能,至今没有找到原因。

悬浮窗口的实现

其次,新建一个qt带界面的类,继承自QWidget,界面中只放一个textEdit,当然可以根据需要放任何控件。如果要自定义textEdit中显示的内容,可以在构造函数中传入textEdit内容作为参数。

floatpan.h实现:

#ifndef FLOATPAN_H
#define FLOATPAN_H

#include <QWidget>

namespace Ui {
class FloatPan;
}

class FloatPan : public QWidget
{
    Q_OBJECT

public:
    explicit FloatPan(QWidget *parent = 0,QString text = "default");
    ~FloatPan();

     void setCustomText(QString text);

private:

    Ui::FloatPan *ui;
};
#endif // FLOATPAN_H

其中大部分内容是qt自动生成的,除了构造函数添加一个参数,添加一个设置自定义的内容的方法。

floatpan.cpp实现:

#include "floatpan.h"
#include "ui_floatpan.h"

FloatPan::FloatPan(QWidget *parent,QString text) :
    QWidget(parent),
    ui(new Ui::FloatPan)
{
    ui->setupUi(this);
    ui->textEdit->setText(text);
    QFont font;
    font.setPixelSize(20);
    font.setBold(true);
    ui->textEdit->setFont(font);
}

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

void FloatPan::setCustomText(QString text)
{
    ui->textEdit->setText(text);
}

在构造函数中设置字体和显示的内容,并且实现设置自定义内容的方法。

如何使用

最后,在使用的地方,首先进行悬浮窗的设置

FloatPan *widget;
widget = new FloatPan();
widget->setCustomText(QString::fromLocal8Bit("测设\r\ntest\r\n测试"));

然后在使用label控件的地方,进行信号和槽的连接

connect(ui->label_1,SIGNAL(show()),this,SLOT(showfloatwindow()));
connect(ui->label_1,SIGNAL(hide()),this,SLOT(hidefloatwindow()));

显示和隐藏悬浮窗实现

void showfloatwindow()
{
    widget->setCustomText(QString::fromLocal8Bit("测设\r\ntest\r\n测试"));
    widget->show();	
}
void hidefloatwindow()
{
    widget->hide();	
}

这样就实现了,当把鼠标移动到label上方时,只有一个textEdit的widget会出现,当把鼠标移开时,这个widget就隐藏了。

  • 11
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟人斩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值