Qt-不规则窗口
1 简介
参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=44
实现效果如下:
图片背景透明,可通过鼠标左键拖动图片(移动时以左上角为坐标),右键关闭。
2 代码及实现说明
我们需要实现的部分主要有:
(1)去掉窗口边框,并把窗口背景设置为透明;
1 //去窗口边框 2 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); 3 //把窗口背景设置为透明 4 setAttribute(Qt::WA_TranslucentBackground);
(2)实现绘图事件函数paintEvent()
1 void Widget::paintEvent(QPaintEvent *event) 2 { 3 QPainter p(this); 4 p.drawPixmap(0, 0, QPixmap("../image/sunny.png")); 5 }
(3)实现鼠标按下事件mousePressEvent()
1 void Widget::mousePressEvent(QMouseEvent *event) 2 { 3 if (event->button() == Qt::RightButton) { 4 //如果是右键 5 close(); 6 } else if (event->button() == Qt::LeftButton) { 7 //求坐标差值 8 //当前点击坐标-窗口左下角坐标 9 p = event->globalPos() - this->frameGeometry().topLeft(); 10 } 11 }
(4)实现鼠标移动事件mouseMoveEvent()
1 void Widget::mouseMoveEvent(QMouseEvent *event) 2 { 3 if (event->buttons() & Qt::LeftButton) { 4 move(event->globalPos() - p); 5 } 6 }
说一下按下鼠标左键,如何计算出移动窗口的坐标的。
globalPos()函数获取的是全局的位置(从整个显示器的左上角计算的),this->frameGeometry().topLeft()获取的是相对于打开窗口的左上角的坐标,它们相减就可以得到打开窗口的左上角相对于整个屏幕的坐标,我们移动窗口时也是以这个坐标来移动的。
(5)完整的代码
widget.cpp
1 #include "widget.h" 2 #include "ui_widget.h" 3 #include <QPainter> 4 #include <QMouseEvent> 5 6 Widget::Widget(QWidget *parent) : 7 QWidget(parent), 8 ui(new Ui::Widget) 9 { 10 ui->setupUi(this); 11 12 //去窗口边框 13 setWindowFlags(Qt::FramelessWindowHint | windowFlags()); 14 //把窗口背景设置为透明 15 setAttribute(Qt::WA_TranslucentBackground); 16 } 17 18 Widget::~Widget() 19 { 20 delete ui; 21 } 22 23 void Widget::paintEvent(QPaintEvent *event) 24 { 25 QPainter p(this); 26 p.drawPixmap(0, 0, QPixmap("../image/sunny.png")); 27 } 28 29 void Widget::mouseMoveEvent(QMouseEvent *event) 30 { 31 if (event->buttons() & Qt::LeftButton) { 32 move(event->globalPos() - p); 33 } 34 } 35 36 void Widget::mousePressEvent(QMouseEvent *event) 37 { 38 if (event->button() == Qt::RightButton) { 39 //如果是右键 40 close(); 41 } else if (event->button() == Qt::LeftButton) { 42 //求坐标差值 43 //当前点击坐标-窗口左下角坐标 44 p = event->globalPos() - this->frameGeometry().topLeft(); 45 } 46 }
widget.h
1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QPoint> 6 7 namespace Ui { 8 class Widget; 9 } 10 11 class Widget : public QWidget 12 { 13 Q_OBJECT 14 15 public: 16 explicit Widget(QWidget *parent = 0); 17 ~Widget(); 18 19 protected: 20 void paintEvent(QPaintEvent *event); 21 void mouseMoveEvent(QMouseEvent *event); 22 void mousePressEvent(QMouseEvent *event); 23 24 private: 25 Ui::Widget *ui; 26 27 QPoint p; 28 }; 29 30 #endif // WIDGET_H