Qt学习笔记:自定义窗体的移动+控件图标

2023-10-29

在这里首先感谢刘大师的作品Qt编写通用主界面导航(开源)
贴上演示:
这里写图片描述


本博客主要是研究了刘大师的作品然后自己总结,做点笔记。。不喜勿喷~~~
废话不多说,先贴出代码解析一下:

 AppInit::Instance()->start();

单例模式 Instance()

首先说说这个这个Instance(),本人由于是C++新手,对此有好多C++知识不懂。因此在这里记录一下:
这个Instance() 介绍说用于单例模式 : 用来保证系统中只有一个实例。
.h 文件中 class类的定义:

 static AppInit *Instance();
 private:
    static AppInit *self;

.c文件中

AppInit *AppInit::self = 0;//静态成员变量需要在类体外面进行初始化。
AppInit *AppInit::Instance()
{
    if (!self) {
        QMutex mutex;//保护一个对象,同一时间只能由一个线程进行访问。
        QMutexLocker locker(&mutex);//加锁
        if (!self) {
            self = new AppInit;//创建一个AppInit对象
        }
    }

    return self;
}

使用时,采用:
AppInit::Instance()->satrt();
通过这种方式进行类实例的调用,保证单例模式的进行。

(2). 自定义窗体的移动:

在main 函数中,首先调用这句话,
AppInit::Instance()->start();

执行单例模式,并且加载事件过滤器。
然后在新建的窗体Widget构造函数中,调用以下函数,这里设置窗体属性(property)是为了对应qApp中加载的事件过滤器。使其能够实现窗体的移动。

this->setWindowFlags(this->windowFlags() | Qt::FramelessWindowHint);//去除标题栏
this->setProperty("canMove", true);//将对象的名称属性的设置为canMove。 可以移动

在AppInit .c文件中:

//加载事件过滤器
void AppInit::start()
{
    qApp->installEventFilter(this);
}

//重写事件过滤器
bool AppInit::eventFilter(QObject *obj, QEvent *evt)//参数:对象,事件
{
    QWidget *w = (QWidget *)obj;//强制转换为QWidget
    if (!w->property("canMove").toBool())//得到QWidget的属性是canMove(可以移动)。
    {
        return QObject::eventFilter(obj, evt);
    }

    static QPoint mousePoint;//静态变量 --> 鼠标坐标
    static bool mousePressed = false;

    QMouseEvent *event = static_cast<QMouseEvent *>(evt);
    if (event->type() == QEvent::MouseButtonPress)//事件类型  鼠标按钮按下
    {
        if (event->button() == Qt::LeftButton) //左键
        {
            mousePressed = true;
            mousePoint = event->globalPos() - w->pos();
            return true;
        }
    }
    else if (event->type() == QEvent::MouseButtonRelease) //事件类型  鼠标按钮释放
    {
        mousePressed = false;
        return true;
    }
    else if (event->type() == QEvent::MouseMove)//事件类型  鼠标移动
    {
        if (mousePressed && (event->buttons() && Qt::LeftButton))
        {
            w->move(event->globalPos() - mousePoint);//窗体移动坐标
            return true;
        }
    }

    return QObject::eventFilter(obj, evt);
}

(3)控件图标:

这里的控件图标实现,主要是采用:fontawesome图标

fontawesome是一个图标的集合,里面有好多的图标,使用起来也还是非常方便的。
图标信息可以到官网去查:http://fontawesome.io/cheatsheet/
fontawesome-webfont.ttf 下载地址:http://pan.baidu.com/s/1sjyvp3v

具体的实现重要是通过调用以下函数:

QPushButton * Btn = new QPushButton(widget);
IconHelper::Instance()->SetIcon(Btn, QChar(0xf192), 12);

其中的QChar(0xf192) 是fontawesome是图标集合中一个图标对应的uncode编码。使用不同的uncode编码即对应了不同的图标。

这里还可以的根据指定的绘制得到需要的pixmap

//依据 宽度,高度,大小,图标uncode十六进制编码,颜色  绘制图片
QPixmap IconHelper::getPixmap(const QString &color, QChar c, quint32 size,
                              quint32 pixWidth, quint32 pixHeight)
{
    QPixmap pix(pixWidth, pixHeight);//定义一个对象
    pix.fill(Qt::transparent);//透明的黑色值(即,QColor(0,0,0,0))填充

    QPainter painter;//定义绘图对象
    painter.begin(&pix);//调用begin时,所有的Pen Brush 重置为默认值。
    //设置给定的绚染提示: 抗锯齿+ 抗锯齿文本
    painter.setRenderHints(QPainter::Antialiasing |QPainter::TextAntialiasing);
    painter.setPen(QColor(color));
    painter.setBrush(QColor(color));

    iconFont.setPointSize(size);
    painter.setFont(iconFont);//设置字体
    painter.drawText(pix.rect(), Qt::AlignCenter, c);//画图标 设置文本中央对齐,
    painter.end();//结束绘画。 绘画时使用的任何资源都被释放。

    return pix;
}

通过调用:

 QPixmap pix = IconHelper::Instance()->getPixmap(listColorText.at(i), listChar.at(i), iconSize, iconWidth, iconHeight);//根据指定绘制图标样式
 btn->setIcon(QIcon(pix));//设置图标

项目代码在我的github仓库:
https://github.com/xiedonghuilove/Package/tree/master/QFreamWork/uidemo18

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt学习笔记:自定义窗体的移动+控件图标 的相关文章

随机推荐

  • Apache下的ArrayUtils工具类总结(操作数组)

    ArrayUtils中的方法 1 add 将给定的数据添加到指定的数组中 返回一个新的数组 2 addAll 合并两个数组 3 contains 检查该数据在该数组中是否存在 返回一个boolean值 4 getLength 返回该数组长度
  • 手把手教你快速排序(非递归)

    目录 一 实现原理 二 代码实现 c语言 今天小编带大家学习快速排序的非递归方法 当然这篇博客是基于大家已经掌握了快排的递归方法的 如果还有不会的童鞋 可以看看下面这篇博客呦 手把手教你快速排序 递归 一 实现原理 首先我们需要一个栈 我们
  • Python:数组添加数据和删除数据

    行添加 删除数据 valid tmp np append valid tmp train tmp idx axis 0 train tmp idx 和valid tmp维数相同 train tmp np delete train tmp i
  • 计算机页码格式罗马数字,word 页码 罗马数字怎么从1开始

    word 页码 罗马数字怎么从1开始以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 word 页码 罗马数字怎么从1开始 第一步 在前几页结束的地方点 插入 gt
  • 华为OD机试真题-区块链转储系统【2023Q1】

    题目描述 区块链底层存储是一个链式文件系统 由顺序的N个文件组成 每个文件的大小不一 依次为F1 F2 Fn 随着时间的推移 所占存储会越来越大 云平台考虑将区块链按文件转储到廉价的SATA盘 只有连续的区块链文件才能转储到SATA盘上 且
  • 将安全信息应用到以下对象时发生错误:C:\Users\lenovo\Application Data无法枚举容器中的对象。访问被拒绝。

    如果找不到Application Data 打开访问权限 右键属性 gt gt 安全 gt gt 高级 更改 高级 然后 确定 gt gt 确定 gt gt 应用 然后回到 应用 这样就能进入Application Data文件夹了
  • 等待和通知机制(wait和notify)

    1 等待和通知机制的实现 wait 方法 wait 是 Object 类的方法 它的作用是使当前执行wait方法的线程进行等待 该方法将当前线程置入 预执行队列 中 并在 wait 所在的代码行处停止执行 直到接到通知或者被中断才能继续执行
  • 代表什么_鸽子飞到家里代表什么

    阅读本文前 请您先点击上面的蓝色字体 教你风水旺财运 再点击 关注 这样您就可以继续免费收到最新资讯了 每天都有分享 完全是免费订阅 请放心关注 现在可能没那么常见 但是在农村家里出现一些外来的生物还是很正常的 对我们也存在影响 对我们来说
  • 【干货】MySQL底层架构设计,你了解多少?

    很多开发同学对SQL优化如数家珍 却对MySQL架构一知半解 岂不是只见树叶 不见森林 终将陷入细节中不能自拔 今天就一块学习MySQL分层架构 深入了解MySQL底层实现原理 以及每层的作用 我们常见的SQL优化到底在哪一层做了优化 小伙
  • vs code使用power mode设置鼠标光标动效

    记录一个开发的题外话 vs code编辑器使用插件 power mode来设置鼠标光标动效 如下 1 vscode 安装 power mode插件 2 打开vscode编辑器 文件 首选项 设置 设置界面 开启power mode插件 设置
  • [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘

    思来想去 虽然很忙 但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客 包括网络爬虫 可视化分析 GIS地图显示 情感分析 舆情分析 主题挖掘 威胁情报溯源 知识图谱 预测预警及AI和NLP应用等 希望该系列线上远程教学对您有所
  • 数据结构 算法大全 基础篇

    数据结构和算法是计算机科学中的两个重要部分 它们对于编写高效 可扩展性强的程序非常重要 数据结构是一种组织和存储数据的方式 它包括一些基本的数据结构 例如数组 链表 栈 队列 树 图等等 数据结构的选择取决于所要解决的问题和使用场景 因此需
  • centos服务器系统下安装python3并与自带的python2

    centos服务器系统下安装python3并与自带的python2 在centos中 自带有python2 因此需要经常安装python3 但是这里有一个坑 就是centos的yum是用python2写的 如果正常编译安装python3 那
  • GDB调试原理

    本地调试gdb 桌面调试主要是本地调试 以gdb为例 1 1 1 gdb调试原理 1 未执行进程调试 启用gdb调试运行gdb test的时候 在操作系统里发生了很多复杂的事情 系统首先会启动gdb进程 这个进程会调用系统函数fork 来创
  • 规则引擎Drools使用 第十四篇 Spring整合Drools

    使用Spring管理整合drools 首先需要引入依赖 然后配置spring文件 引入依赖
  • 基于stm32F103C8T6的智能门禁(毕业设计)

    刷卡 分享一期 RC522刷卡模块做的门禁系统 上面是视频呈现 功能文字说明 拓展空间非常大 识别卡号以及卡类并显示 刷管理卡 按下按键 提示刷卡录入 刷未录入的卡即可录入 刷用户卡 按下按键 提示刷卡录入 刷未录入的卡即可录入 再次刷卡
  • 【Cesium入门】一、Cesium安装部署运行

    1 介绍 CesiumJS是一个用于Web上3D地图的JavaScript库 开发者通过Cesium 实现无插件的创建三维球 Cesium通过WebGL技术实现图形的硬件加速 并且跨平台 跨浏览器 2 Cesium项目下载 1 在官网下载压
  • java arraylist<>_Java ArrayList

    Java ArrayList的构造方法和方法 Constructor Summary Constructors ConstructorDescription Constructs an empty list with an initial
  • STM32+AIR800关于温湿度采集上传阿里云以及进行云端下发指令简单的控制

    一 主要功能实现 1 STM32采集温湿度上传至阿里云 进行云端显示 2 云端下发指令控制STM32的LED亮灭 直接控制STM32 A 的LED亮灭 以及设置定时时间自动打开和关闭LED 3 云端下发指令通过NRF24L01间接控制第二个
  • Qt学习笔记:自定义窗体的移动+控件图标

    在这里首先感谢刘大师的作品 Qt编写通用主界面导航 开源 贴上演示 本博客主要是研究了刘大师的作品然后自己总结 做点笔记 不喜勿喷 废话不多说 先贴出代码解析一下 AppInit Instance gt start 单例模式 Instanc