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


posted @ 2021-01-09 23:38  mohist  阅读(1067)  评论(0编辑  收藏  举报