Qt學習筆記(三十一):創建一個不規則窗口


不規則窗口,先看一下效果圖:

widget.h:

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
    
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
private:
    Ui::Widget *ui;
    
    // 聲明兩個變量,記錄鼠標按下時的座標
    int x;
    int y;
    
protected:
    // 重寫繪圖事件
    void paintEvent(QPaintEvent *); 
    
    // 重寫鼠標移動和鼠標按下事件
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
};

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter>
#include <QMouseEvent>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    // 設置窗口標誌
    // Qt::FramelessWindowHint:表示去除邊框
    // this->windowFlags():表示獲取窗口原來的標誌
    this->setWindowFlags(Qt::FramelessWindowHint | this->windowFlags());
    
    // 設置窗口背景透明;需要和 Qt::FramelessWindowHint 一起使用
    this->setAttribute(Qt::WA_TranslucentBackground);
    
    // 開啓鼠標追蹤
    this->setMouseTracking(true);
}

Widget::~Widget()
{
    delete ui;
}

// 窗口重繪事件
void Widget::paintEvent(QPaintEvent *)
{
    // 在主窗口上畫一個圖片
    QPainter painter(this);    
    painter.drawPixmap(0, 0, QPixmap(":/Image/LuffyQ.png"));
}

// 鼠標按下事件
void Widget::mousePressEvent(QMouseEvent *e)
{
    // 鼠標按下時,記錄當前點擊位置的座標
    if (e->button() == Qt::LeftButton)
    {
        x = e->x();
        y = e->y();
    }
    else if (e->button() == Qt::RightButton)
    {
        int ret = QMessageBox::question(this, "系統提示", "確定要關閉當前窗口嗎?");
        if (ret == QMessageBox::Yes)
        {
            // 關閉窗口
            this->close();
        }
    }
}

// 鼠標移動事件
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    // 如果始終按住左鍵,纔會移動
    if (e->buttons() & Qt::LeftButton)
    {
        // 將窗口移動到新的位置
        this->move(e->globalX() - x, e->globalY() - y);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章