不規則窗口,先看一下效果圖:
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);
}
}