qt5之设置无边窗口移动
Note
qt version: 5.12
qt creator: 4.13
- 本文将介绍 设置无边窗口和设置窗口的移动
- 你要知道: QDialog 和 QMainWindow都是 QWidget的派生类
- 本文建立的是基于QDialog的demo
- 演示的demo将是窗口半透明控件不透明
设置无边窗口
需要下面的代码设置无边窗口,其为QWidget的一个公有函数
setWindowFlags(Qt::FramelessWindowHint);
设置半透明
设置半透明需要以下的条件:
- 设置窗口为无边窗口
- 重写函数paintEvent
- 设置窗口属性:setAttribute(Qt::WA_TranslucentBackground, true);
设置为无边窗口
我在构造函数中加入下面的代码
setWindowFlags(Qt::FramelessWindowHint);
设置窗口属性为半透明
构造函数中,加入下面的的代码
setAttribute(Qt::WA_TranslucentBackground, true);
重写函数paintEvent
头文件中加入下面的代码用作声明
protected:
// 用作绘制半透明窗口
void paintEvent(QPaintEvent *e) override;
源文件中实现如下
void Dialog::paintEvent(QPaintEvent *e)
{
QDialog::paintEvent(e);
QPainter p(this);
// QColor(RGBA)
p.fillRect(rect(), QColor(0,0,0,100));
}
代码中的QColor(0,0,0,100), 其中,100是表示透明度,范围是0~255, 255是不透明, 0 是全透明
窗口背景颜色可以自行搭配
需要头文件
源文件中加入下面的代码
#include <QPainter>
效果
下面开始贴移动窗口的代码, 参考这里
窗口移动
头文件
源文件中添加下面的代码
#include <QMouseEvent>
.h 文件中加入下面的声明
移动窗口需要重写下面的3个函数
protected:
//拖拽窗口
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
源文件中的代码
void Dialog::mousePressEvent(QMouseEvent *event)
{
QDialog::mousePressEvent(event);
if (nullptr == event || NULL == event)
return;
if(event->button() == Qt::LeftButton)
{
drag_ = true;
//获得鼠标的初始位置
mouse_start_point_ = event->globalPos();
//获得窗口的初始位置
window_top_left_point_ = this->frameGeometry().topLeft();
}
}
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
QDialog::mouseMoveEvent(event);
if (NULL == event || nullptr == event)
return;
if (drag_)
{
// 获取鼠标移动的距离
QPoint distance = event->globalPos() - mouse_start_point_;
// 改变窗口的位置
this->move(window_top_left_point_ + distance);
}
}
void Dialog::mouseReleaseEvent(QMouseEvent *event)
{
QDialog::mouseReleaseEvent(event);
if (nullptr == event || nullptr == event)
return;
if(event->button() == Qt::LeftButton)
{
drag_ = false;
}
}
下面是完整源码
.h 完整源码
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
Ui::Dialog *ui;
protected:
// 用作绘制半透明窗口
void paintEvent(QPaintEvent *e) override;
//拖拽窗口
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
private:
// 是否拖拽
bool drag_ = false;
QPoint mouse_start_point_;
QPoint window_top_left_point_;
};
#endif // DIALOG_H
.cpp 完整源码
#include "dialog.h"
#include "./ui_dialog.h"
#include <QPainter>
#include <QMouseEvent>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::paintEvent(QPaintEvent *e)
{
QDialog::paintEvent(e);
QPainter p(this);
// QColor(RGBA)
p.fillRect(rect(), QColor(0,0,0,150));
}
void Dialog::mousePressEvent(QMouseEvent *event)
{
if (nullptr == event || NULL == event)
return;
if(event->button() == Qt::LeftButton)
{
drag_ = true;
//获得鼠标的初始位置
mouse_start_point_ = event->globalPos();
//获得窗口的初始位置
window_top_left_point_ = this->frameGeometry().topLeft();
}
}
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
if (NULL == event || nullptr == event)
return;
if (drag_)
{
// 获取鼠标移动的距离
QPoint distance = event->globalPos() - mouse_start_point_;
// 改变窗口的位置
this->move(window_top_left_point_ + distance);
}
}
void Dialog::mouseReleaseEvent(QMouseEvent *event)
{
if (nullptr == event || nullptr == event)
return;
if(event->button() == Qt::LeftButton)
{
drag_ = false;
}
}