33黑马QT笔记之不规则窗口

33黑马QT笔记之不规则窗口

1 创建不规则窗口的步骤:
1)重写绘图事件,在绘图事件中显示一张图片。
2)但是显示图片后仍带有窗口的边框,所以我们需要在窗口的构造函数中去掉边框,并使其类似图片一样,使窗口也透明显示。
3)由于边框没了,即右上角的按钮无了,鼠标无法操作图片,所以需要重写鼠标事件,包括鼠标按下和移动事件。
4)鼠标按下时:若为右键,我们使它关闭窗口;若为左键,记录其相对于窗口的坐标。利用它在鼠标移动事件中按下左键不放时可以拖拽不规则窗口。
5)鼠标移动时:鼠标移动事件触发时,若是鼠标左键处于按下状态,则利用左键按下时记录的坐标,使其与全局坐标相减,得出相对于屏幕的窗口原点坐标来移动窗口。

注意重点:创建不规则窗口全程只需要记住,鼠标在按下状态,触发鼠标移动事件时,以相对于屏幕的窗口原点坐标来移动。即:p代表鼠标按下时相对于窗口的坐标。

move(e->globalPos()-p);

2 代码:只给出.cpp实现文件足够理解。

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QMouseEvent>
#include<QtGlobal>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //第二步
    //去窗口边框  ---Qt::表示枚举类型  windowFlags()保持原来窗口属性
    setWindowFlags(Qt::FramelessWindowHint|windowFlags());
    //设置属性使窗口背景透明(不透明则与图片一样 背景不透明)  但由于边框不见了无法移动,所以需要重写鼠标事件
    //QImage image(0,0,QImage::Format_ARGB32);QImage的参3也可以设置QImage设备背景透明
    setAttribute(Qt::WA_TranslucentBackground);

}

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


//第一步
void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);

    p.drawPixmap(0,0,width(),height(),QPixmap("F:/work/Qt code/image/sunny.png"));
}


//第四步  --第三步包括第四第五步
void Widget::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton)
       {
          //右键直接关闭
          close();

       }
    if(e->button() == Qt::LeftButton)

        {
          //左键需要移动,所以需要坐标差值
          //相对于全局取两个坐标求得 当前坐标相对于窗口 的差值
          p=e->globalPos() - this->frameGeometry().topLeft();


        }

}


//第五步
void Widget::mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons() == Qt::LeftButton)  //button()表示按下那一刻发生哪些事件    buttons()表示按键状态
    {
        move(e->globalPos()-p);   //记住移动是以窗口左上角为标准就可以理解了
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值