QT软件开发: 窗口鼠标事件穿透

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT软件开发: 窗口鼠标事件穿透相关的知识,希望对你有一定的参考价值。

一、需求

 弹出的子窗口要顶置在最前面,播放指定的动画,不能有任务栏图标,不能影响鼠标操作窗口背后的其他界面。 (相当于桌面动画效果)

二、效果示例

 

三、子窗口代码

3.1 form.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QStyleOption>
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#include <QDesktopWidget>
#include <QMovie>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();
protected:
     void paintEvent(QPaintEvent *p1);
private:
    Ui::Form *ui;
    QMovie *mv;
};

#endif // FORM_H

3.2 form.cpp

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    //放在窗口最前面执行,可以实现全穿透,不响应本窗口的事件
    //所有鼠标事件都穿透的方法:直接设置子窗体的属性
    //如果不执行该属性设置. 是可以响应本窗口的事件
    setAttribute(Qt::WA_TransparentForMouseEvents, true);

    //隐藏标题栏
    setWindowFlags(Qt::FramelessWindowHint);//无边框

    //打开的窗口在屏幕中间
    QDesktopWidget *widget= QApplication::desktop();
    move((widget->width()-this->width())/2,(widget->height()-this->height())/2);

    //窗口大小
    this->resize(320,240);

    //设置窗口顶置: 一直在最前面. 并且隐藏任务栏的图标
    Qt::WindowFlags m_flags = windowFlags();
    setWindowFlags(m_flags| Qt::FramelessWindowHint |Qt::WindowStaysOnTopHint|Qt::WindowStaysOnTopHint|Qt::Tool);

    //设置窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground);

    //播放GIF动画
    mv = new QMovie(":/load.gif");
    ui->label->setMovie(mv);
    mv->start();//开始播放
}


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


void Form::paintEvent(QPaintEvent *p1)
{
    QPainter p(this);

    //绘制样式
    QStyleOption opt;
    opt.initFrom(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);//绘制样式

    //定义画笔
    QPen pen;
    pen.setWidth(10);
    pen.setColor(QColor("#00B0AE"));

    pen.setStyle(Qt::SolidLine); //线的样式--实线
    p.setPen(pen);

    pen.setWidth(5);
    pen.setStyle(Qt::DashDotLine); //线的样式
    p.setPen(pen);

    //创建画刷
//    QBrush brush;
//    brush.setColor(QColor("#00B0AE"));
//    brush.setStyle(Qt::Dense1Pattern); //矩形框填充的样式
//    p.setBrush(brush);
    p.drawRect(p1->rect());
}

以上是关于QT软件开发: 窗口鼠标事件穿透的主要内容,如果未能解决你的问题,请参考以下文章

qt linux窗口大小变化后刷新鼠标事件

用qt做了一软件,不同应用程序切换鼠标点击事件,视频窗口会闪烁一下,求高手指导知道,谢谢!

Unity3dUGUI鼠标穿透UI问题的解决方法

JavaFX窗口拖动

qt中当鼠标点击子窗口时如何让父窗口响应鼠标点击事件?

在 QT 中为图像标签创建鼠标事件