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); //记住移动是以窗口左上角为标准就可以理解了
}
}