Qt视频播放窗口叠加透明窗口_qt可以叠加透明窗口吗-CSDN博客
Excerpt
文章浏览阅读3k次,点赞3次,收藏30次。本人在做一个视频监控项目时,遇到了透明窗口无法透明的问题,特记录下解决过程_qt可以叠加透明窗口吗
前言
本人在做一个视频监控项目时,遇到了透明窗口无法透明的问题,特记录下解决过程。
更新:经测试,本文提到的方法用于多分屏复杂的视频播放窗口时有问题。
目录
前言
一、需求
二、关键代码
2.1、透明窗口设置
2.1.1、构造函数中调用以下代码
2.1.2、重载paintEvent事件
2.2、视频播放窗口设置
2.2.1、调用透明窗口
2.2.2、透明窗口位置及大小自适应视频窗口
2.2.3、坐标转换
三、所有源码
3.1、透明窗口
3.2、视频播放窗口
一、需求
在视频播放界面上,叠加一个透明窗口,实现拉框局部放大功能。
本来以为这个很简单,直接给窗口加一个透明设置项就行,但最终发现,在未播放视频时,窗口确实是透明的,但是当开始播放视频后,窗口就不透明了,特此记录下本人最终的解决办法。
先看下效果图:
二、关键代码
2.1、透明窗口设置
2.1.1、构造函数中调用以下代码
1 2 3
| setAttribute(Qt::WA_TranslucentBackground, true);
setWindowFlags(Qt::SplashScreen|Qt::FramelessWindowHint);
|
第一行,使透明背景生效,透明背景在paintEvent中设置;
第二行,Qt::SplashScreen,启动画面,原本使用的Qt::ToolTip标签,但是这个会导致窗口一直置顶,所以换成了Qt::SplashScreen。Qt::FramelessWindowHint让窗口无边框,窗口如果是其它控件的子控件,这句也可以不要;
2.1.2、重载paintEvent事件
1 2 3 4 5 6 7
| void DigitalZoom::paintEvent(QPaintEvent *event){
QPainter painter(this);
painter.fillRect(this->rect(), QColor(0, 0, 0, 1));
}
|
2.2、视频播放窗口设置
2.2.1、调用透明窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mainWidget::mainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::mainWidget)
{
ui->setupUi(this);
m_digitalZoomWidget = new DigitalZoom(this);
m_digitalZoomWidget->show();
}
|
2.2.2、透明窗口位置及大小自适应视频窗口
使用Qt::SplashScreen后,透明窗口的位置和大小就和其父窗口没有关系了,需要对位置进行转换,我这里因为透明窗口的父类是视频播放窗口,所以在视频播放窗口类中重载了moveEvent和resizeEvent事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void mainWidget::resizeEvent(QResizeEvent *event)
{
m_digitalZoomWidget->resize(width(),height());
}
void mainWidget::moveEvent(QMoveEvent *event)
{
m_digitalZoomWidget->move(geometry().x(),geometry().y());
}
|
2.2.3、坐标转换
本人因为需要实现数字放大功能,所以需要转换拉框坐标,这里就不列出了。
三、所有源码
3.1、透明窗口
digitalzoom.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #ifndef DIGITALZOOM_H
#define DIGITALZOOM_H
#include <QWidget>
class DigitalZoom : public QWidget
{
Q_OBJECT
public:
explicit DigitalZoom(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
signals:
public slots:
private:
QPoint m_startPoint;
QPoint m_endPoint;
bool m_bIsLeftMousePressMove = false;
};
#endif
|
digitalzoom.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include "digitalzoom.h"
#include <QPainter>
#include <QPaintEvent>
#include <QLabel>
DigitalZoom::DigitalZoom(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_TranslucentBackground, true);
setWindowFlags(Qt::SplashScreen|Qt::FramelessWindowHint);
QLabel* upLab = new QLabel("我是透明窗口上的不透明控件",this);
upLab->setStyleSheet("color:red");
}
void DigitalZoom::paintEvent(QPaintEvent *event){
QPainter painter(this);
if(m_bIsLeftMousePressMove){
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(QColor(0, 160, 230), 5));
painter.drawRect(event->rect());
}else{
painter.fillRect(this->rect(), QColor(0, 0, 0, 1));
}
}
void DigitalZoom::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
m_startPoint = event->pos();
}
QWidget::mousePressEvent(event);
}
void DigitalZoom::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton){
m_endPoint = event->pos();
m_bIsLeftMousePressMove = true;
update(QRect(m_startPoint,m_endPoint));
}
}
void DigitalZoom::mouseReleaseEvent(QMouseEvent *event)
{
if(m_bIsLeftMousePressMove){
m_bIsLeftMousePressMove = false;
}
update();
}
|
3.2、视频播放窗口
mainWidget.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include "digitalzoom.h"
namespace Ui {
class mainWidget;
}
class mainWidget : public QWidget
{
Q_OBJECT
public:
explicit mainWidget(QWidget *parent = nullptr);
~mainWidget();
protected:
void resizeEvent(QResizeEvent *event) override;
void moveEvent(QMoveEvent *event) override;
private:
Ui::mainWidget *ui;
DigitalZoom* m_digitalZoomWidget;
};
#endif
|
mainWidget.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include "mainwidget.h"
#include "ui_mainwidget.h"
mainWidget::mainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::mainWidget)
{
ui->setupUi(this);
m_digitalZoomWidget = new DigitalZoom(this);
m_digitalZoomWidget->show();
}
mainWidget::~mainWidget()
{
delete ui;
}
void mainWidget::resizeEvent(QResizeEvent *event)
{
m_digitalZoomWidget->resize(width(),height());
}
void mainWidget::moveEvent(QMoveEvent *event)
{
m_digitalZoomWidget->move(geometry().x(),geometry().y());
}
|
mainWidget.ui
默认生成,未作任何修改。