当前位置: 首页 > news >正文

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

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

文章目录

  • 前言
  • 一、不规则窗体概述
  • 二、效果实例
  • 三、原码详解
    • widget.h
    • main.cpp
    • widget.cpp
  • 四、总结


前言

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


一、不规则窗体概述

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

二、效果实例

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

三、原码详解

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

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

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
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"));
}

其中,
(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)

其中,参数 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。


四、总结

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

相关文章:

  • MySQL 5.7.x--命令行自带帮助文档的使用,超级棒!!!
  • 手撕前端面试题【javascript】
  • Qt5开发从入门到精通——第四篇十三节(程序启动画面 )
  • postman+Newman+jenkins实现接口自动化测试持续集成
  • 阿里达摩院(研究型实习生)
  • 汽车电子常用外围硬件电路设计
  • 猿创征文|半导体二极管
  • 《机器学习实战》学习笔记(十一)
  • 多态原理之虚函数表VBTL
  • 域前期信息收集
  • C语言经典算法实例3:数组元素排序
  • 网络安全工具AntSword蚁剑内存马使用
  • 【FPGA教程案例73】基础操作3——基于FPGA的Vivado功耗估计
  • k8s的数据存储
  • 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】
  • docker python 配置
  • es6--symbol
  • Java教程_软件开发基础
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Redash本地开发环境搭建
  • Service Worker
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 初识 beanstalkd
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 浮动相关
  • 漂亮刷新控件-iOS
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 区块链技术特点之去中心化特性
  • 如何设计一个比特币钱包服务
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信公众号开发小记——5.python微信红包
  • 第二十章:异步和文件I/O.(二十三)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ![CDATA[ ]] 是什么东东
  • #《AI中文版》V3 第 1 章 概述
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (007)XHTML文档之标题——h1~h6
  • (Forward) Music Player: From UI Proposal to Code
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)大道至简,职场上做人做事做管理
  • ***原理与防范
  • .NET 常见的偏门问题
  • .net 无限分类
  • ??eclipse的安装配置问题!??
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BT]BUUCTF刷题第4天(3.22)
  • [C#][DevPress]事件委托的使用
  • [C#7] 1.Tuples(元组)
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CSS]中子元素在父元素中居中