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软件开发: 窗口鼠标事件穿透的主要内容,如果未能解决你的问题,请参考以下文章