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 }
View Code

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
View Code
原文地址:https://www.cnblogs.com/mrlayfolk/p/13263478.html