#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置无边框
this->setWindowFlags(Qt::FramelessWindowHint);
this->resize(600,400);
//添加两个btn用于控制窗口最小化与退出
min = new QPushButton("-",this);
quit = new QPushButton("X",this);
min->setGeometry(QRect(this->width()-60,0,30,30));
quit->setGeometry(QRect(this->width()-30,0,30,30));
//使用信号与槽将btn与槽函数连接
connect(min,QPushButton::clicked,this,dealBtnMin);
connect(quit,QPushButton::clicked,this,dealBtnQuit);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//我们重写鼠标事件,只是在原来的鼠标基础事件上加上新的功能,所以仍需要父类的鼠标事件
QWidget::mouseMoveEvent(event);
//鼠标移到哪,窗口就移动到哪
//因为鼠标按下的位置跟鼠标左上角的位置是相对固定的
QPoint y = event->globalPos();
//桌面左上角的点 - 鼠标相对于窗口左上角的点=窗口相对于桌面所在的位置
this->move(y-z);
}
void Widget::mousePressEvent(QMouseEvent *event)
{
//我们重写鼠标事件,只是在原来的鼠标基础事件上加上新的功能,所以仍需要父类的鼠标事件
QWidget::mouseMoveEvent(event);
//x为鼠标点相对于窗口左上角的位置
QPoint x = this->geometry().topLeft();
//y为鼠标点击位置相对于桌面左上角所在的位置
QPoint y = event->globalPos();
//z为窗口相对于桌面左上角的位置
z = y-x;
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
//我们重写鼠标事件,只是在原来的鼠标基础事件上加上新的功能,所以仍需要父类的鼠标事件
QWidget::mouseMoveEvent(event);
//将z清空
this->z = QPoint();
}
void Widget::dealBtnMin(){
this->showMinimized();
}
void Widget::dealBtnQuit(){
this->close();
}
为了方便,我用- 和X代替了btn上的图片,不嫌麻烦的可以搞两个图上去,更好看。
实现效果
修复一个bug
当我们点击在btn上时,拖拽窗口,会出现窗口乱跑的情况。
这是因为,我们点击在btn上时,鼠标事件被btn捕捉,我们得到的点击的位置z为空,所以会出现乱跑的情况。
解决办法: 在mouseMoveEvent函数中,判断z是否为空,如果为空,直接返回。
if(z == QPoint()){
return ;
}