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;
}
}