首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >QT软件开发: 窗口鼠标事件穿透

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

作者头像
DS小龙哥
发布2022-01-12 10:34:45
发布2022-01-12 10:34:45
3.8K0
举报

一、需求

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

二、效果示例

三、子窗口代码

3.1 form.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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());
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、需求
  • 二、效果示例
  • 三、子窗口代码
    • 3.1 form.h
    • 3.2 form.cpp
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档