在这里首先感谢刘大师的作品: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;//强制转换为QWidgetif (!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

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

  1. Qt工作笔记-设置窗体底纹以及控件透明度

    目录 原理 关键代码 原理 在Web界面里面,可以看到,web前端程序员喜欢用一些淡淡的底纹(非背景),在此我也想实现下CS模型里面,Qt实现底纹功能! 程序运行截图如下: 底纹是这样的! 这里来展示 ...

  2. 自定义窗体设计器-控件测试

    自定义窗体设计器-控件测试 基于.net2的自定义窗体设计器控件(类似visual studio的vb,c#设计器,其实就是vs2005的设计器) 控件由四部分组成:工具栏,工具箱,绘图设计区,属性框 ...

  3. vs2010 学习Silverlight学习笔记(8):使用用户控件

    概要: 这个类似于封装控件样式.不过封装的是整个或是多个控件罢了,然后用的时候就可以直接引用过来了. 创建用户控: 这个也很简单,不过有几个地方需要注意下.这个就不照抄了,咱们也自己写一个. 步骤: ...

  4. ASP.Net学习笔记002--ASP.Net服务端控件做了什么2

    ASP.Net学习笔记002--ASP.Net服务端控件做了什么2 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交 ...

  5. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  6. 学习笔记---母板页、用户控件、第三方控件及视图状态管理

    一.母版页 在制作页面的过程中, 多个页面往往具有相同的页面Header和页面Footer, 多个页面只是在中间部分有变化. 那么我们完全可以避免在每个页面中都写一遍页头和页尾的代码, 这种技术就是母 ...

  7. android自定义控件中文乱码,Android笔记--自定义View之组合控件

    Android-自定义View 分享是最好的记忆-- 如需转发请注明出处 [强调]:共同学习 共同进步 不喜勿喷 内容简介 前言 实现 总结 1. 前言 这次更新有2个目的 1. 复用控件,而不是每次 ...

  8. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  9. Android入门到精通|安卓/Android开发零基础系列Ⅱ【职坐标】-学习笔记(1)-- 常用控件及资源介绍

    前言 为了巩固Android基础知识,回顾一下学习内容,才有此学习笔记. IDE Androdi Studio 4 + Genymotion 创建项目 修改项目的 build.gradle,添加国内镜 ...

最新文章

  1. Pacbio 数据相关的几个重要概念
  2. [BZOJ4894]天赋
  3. python | ^ ~
  4. 一年赚上亿的生意_如何一年不到的时间2万赚10个亿?
  5. fat32 linux 打包工具_11款最棒的Linux数据恢复工具发布啦!
  6. 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
  7. servlet下载文件(注意文件名字必须是英文)
  8. 【转】C#获取当前日期时间(转)
  9. Solaris11创建NFS服务
  10. Eclipse里面导工程的时候报错faceted project problem
  11. mybatis事物如何避免脏读_新手指南:如何从java电商小白到秒杀大咖
  12. 利用python处理excel文件并可视化处理-python如何将excel数据处理可视化
  13. android 水晶报表,水晶报表分组,统计,求和,sum()函数使用
  14. 文档管理系统 Mayan EDMS安装
  15. 2021年如何通过网络赚钱
  16. 制造业必须应用RPA的十大环节
  17. 量子力学顺口溜_数学的幽默打油诗
  18. 解决由于权限问题导致YUM安装失败
  19. hdu1864最大报销额 (01背包)
  20. 《LoadRunner 12七天速成宝典》目录—导读

热门文章

  1. IMX6ULL博通wifi移植BCM4345C5
  2. 微软CEO鲍尔默失策太多次 应只拿1美元年薪
  3. AUTOSAR - WDGM认知过程(二):配置分析
  4. 【微前端】什么是微前端
  5. 经验分享:Python3离线安装及库更新
  6. 电脑插座,电脑专用插座如何接线?电脑专用插座如何挑选?
  7. UI(1)---手机界面设计中12种常用布局
  8. SpaceX载人航天飞船点火升空 送4名宇航员去空间站
  9. 【Django快速开发实战】(1~29)使用Django创建一个基础应用:职位管理系统
  10. ue4 Android打包示例