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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值