• 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
  • 相关阅读:
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    Concurrent Programming(5)
    Concurrent Programming(4)
    Concurrent Programming(3)
    Concurrent Programming(2)
    Concurrent Programming(1)
    Lua用table模拟二维数组
    C#深入研究ArrayList动态数组自动扩容原理
    ==与Equals的作用
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/13263478.html
Copyright © 2020-2023  润新知