• Qt5开发从入门到精通——第四篇十二节(不规则窗体)


    欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
    博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀


    前言

    本章节将会给大家带来不规则窗体的详细使用方法


    一、不规则窗体概述

    常见的窗体通常是各种方形的对话框,但有时也需要使用非方形的窗体,如圆形、椭圆形,甚至是不规则形状的对话框。
    利用 setMaskO函数为窗体设置遮罩,实现不规则窗体。设置遮罩后的窗体尺寸仍是原窗体大小,只是被遮罩的地方不可见。

    二、效果实例

    图一
    新建Resources 并添加图片即可(图片格式改为xxx.png)
    在这里插入图片描述

    三、原码详解

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
    protected:
    void mousePressEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
    void paintEvent(QPaintEvent *);
    private:
    QPoint dragPosition;
    };
    
    #endif // WIDGET_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    main.cpp

    #include "widget.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    widget.cpp

    #include "widget.h"
    #include 
    #include 
    #include 
    #include 
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        QPixmap pix;  ///新建一个 QPixmap 对象
        pix.load(":/sr/16.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);//(a)
        resize(pix.size());//(b)
        setMask(QBitmap(pix.mask())); //(c)
    }
    
    Widget::~Widget()
    {
    
    }
    
    void Widget::mousePressEvent(QMouseEvent *event)
    {
        if(event->button()==Qt::LeftButton)
        {
            dragPosition =event->globalPos()-frameGeometry().topLeft();
            event->accept();
        }
        if (event->button()==Qt::RightButton)
        {
            close();
        }
    }
    
    void Widget::mouseMoveEvent(QMouseEvent *event)
    {
        if(event->buttons()&Qt::LeftButton)
        {
            move(event->globalPos()-dragPosition);
            event->accept ();
        }
    }
    
    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.drawPixmap(0,0,QPixmap(":/sr/16.png"));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    其中,
    (a)pix.load(“:/sr/16.png”,0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither):调用 QPixmap 的 load()函数为 QPixmap 对象填入图像值。
    load() 函数的原型如下:

    bool QPixmap::load (const QString & fileName, const char* format= 0, Qt::ImageConversionFlags flags= Qt::AutoColor)
    
    • 1

    其中,参数 fileName 为图片文件名;参数 format 表示读取图片文件采用的格式,此处为 0表示采用默认的格式;参数 flags 表示读取图片的方式,由 Qt: :ImageConversionFlags 定义,此处设置的标识为避免图片抖动方式。

    (b) resize(pix.size()):重设主窗体的尺寸为所读取的图片的大小。

    (c)setMask(QBitmap(pix.mask())):为调用它的控件增加一个遮罩,遮住所选区域以外的部分使其看起来是透明的,它的参数可为一个 QBitmap 对象或一个 QRegion 对象,此处调用QPixmap 的 mask() 函数用千获得图片自身的遮罩,为一个 QBitmap 对象,实例中使用的是 PNG格式的图片,它的透明部分实际上是一个遮罩。
    使不规则窗体能够响应鼠标事件、随意拖曳的函数,是重定义的鼠标按下响应函数mousePressEvent(QMouseEvent *), 首先判断按下的是否为鼠标左键 。 若是,则保存当前鼠标点所在的位置相对于窗体左上角的偏移值 dragPosition: 若按下的是鼠标右键,则关闭窗体。

    鼠标移动响应函数 mouseMoveEvent(QMouseEvent*), 首先判断当前鼠标状态,调用 event->buttons()返回鼠标的状态,若为左键则调用 QWidget 的 move() 函数将窗体移动至鼠标当前点。由于move()函数的参数指的是窗体的左上角的位置,因此要使用鼠标当前点的位置减去相对窗体左上角的偏移值 dragPosition。


    四、总结

    不规则窗体会在应用程序开发中经常用到的

  • 相关阅读:
    今天零九的雪
    前端基础建设与架构06 core-js 及垫片理念:设计一个“最完美”的 Polyfill 方案
    5.0 nodejs通过thrift连接hbase
    POAP:NFT的采用入口?
    企业架构LNMP学习笔记35
    写代码,必须要优雅...
    三姐妹不吸烟患肺癌,做饭人需要了解油烟的三大危害
    CSDN的文档编辑器使用
    C语言基础语法复习08-位域bit-fields
    八大排序(四)--------直接插入排序
  • 原文地址:https://blog.csdn.net/weixin_44759598/article/details/126684360