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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM