不规则窗口,先看一下效果图:
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);
}
}