当前位置:   article > 正文

Qt中实现悬浮窗口_qt中创建顶层悬浮的工具栏

qt中创建顶层悬浮的工具栏

前言

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

具体描述就是,当把鼠标移动到label上方时,只有一个textEdit的widget会出现,当把鼠标移开时,这个widget会隐藏。

label控件实现

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

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

  1. #ifndef QMYLABEL_H
  2. #define QMYLABEL_H
  3. #include <QObject>
  4. #include <QLabel>
  5. class QMyLabel : public QLabel
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit QMyLabel(QWidget *parent = nullptr);
  10. signals:
  11. void show();
  12. void hide();
  13. public slots:
  14. private:
  15. void enterEvent(QEvent * event);
  16. void leaveEvent(QEvent * event);
  17. };
  18. #endif // QMYLABEL_H

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

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

  1. #include "qmylabel.h"
  2. QMyLabel::QMyLabel(QWidget *parent)
  3. {
  4. this->setMouseTracking(true);
  5. }
  6. void QMyLabel::enterEvent(QEvent * event)
  7. {
  8. emit show();
  9. }
  10. void QMyLabel::leaveEvent(QEvent * event)
  11. {
  12. emit hide();
  13. }

注意:

this->setMouseTracking(true);

这句话一定要有,是用来开启跟踪鼠标功能的。

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

悬浮窗口的实现

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

floatpan.h实现:

  1. #ifndef FLOATPAN_H
  2. #define FLOATPAN_H
  3. #include <QWidget>
  4. namespace Ui {
  5. class FloatPan;
  6. }
  7. class FloatPan : public QWidget
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit FloatPan(QWidget *parent = 0,QString text = "default");
  12. ~FloatPan();
  13. void setCustomText(QString text);
  14. private:
  15. Ui::FloatPan *ui;
  16. };
  17. #endif // FLOATPAN_H

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

floatpan.cpp实现:

  1. #include "floatpan.h"
  2. #include "ui_floatpan.h"
  3. FloatPan::FloatPan(QWidget *parent,QString text) :
  4. QWidget(parent),
  5. ui(new Ui::FloatPan)
  6. {
  7. ui->setupUi(this);
  8. ui->textEdit->setText(text);
  9. QFont font;
  10. font.setPixelSize(20);
  11. font.setBold(true);
  12. ui->textEdit->setFont(font);
  13. }
  14. FloatPan::~FloatPan()
  15. {
  16. delete ui;
  17. }
  18. void FloatPan::setCustomText(QString text)
  19. {
  20. ui->textEdit->setText(text);
  21. }

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

如何使用

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

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

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

  1. connect(ui->label_1,SIGNAL(show()),this,SLOT(showfloatwindow()));
  2. connect(ui->label_1,SIGNAL(hide()),this,SLOT(hidefloatwindow()));
  3. 1.
  4. 2.
  5. 显示和隐藏悬浮窗实现
  6. void showfloatwindow()
  7. {
  8. widget->setCustomText(QString::fromLocal8Bit("测设\r\ntest\r\n测试"));
  9. widget->show();
  10. }
  11. void hidefloatwindow()
  12. {
  13. widget->hide();
  14. }

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

 进群领取qt开发学习资料以及技术交流  在下方↓↓↓↓↓↓↓↓

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号