Qt学习笔记:自定义窗体的移动+控件图标
在这里首先感谢刘大师的作品: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学习笔记:自定义窗体的移动+控件图标相关推荐
- Qt工作笔记-设置窗体底纹以及控件透明度
目录 原理 关键代码 原理 在Web界面里面,可以看到,web前端程序员喜欢用一些淡淡的底纹(非背景),在此我也想实现下CS模型里面,Qt实现底纹功能! 程序运行截图如下: 底纹是这样的! 这里来展示 ...
- 自定义窗体设计器-控件测试
自定义窗体设计器-控件测试 基于.net2的自定义窗体设计器控件(类似visual studio的vb,c#设计器,其实就是vs2005的设计器) 控件由四部分组成:工具栏,工具箱,绘图设计区,属性框 ...
- vs2010 学习Silverlight学习笔记(8):使用用户控件
概要: 这个类似于封装控件样式.不过封装的是整个或是多个控件罢了,然后用的时候就可以直接引用过来了. 创建用户控: 这个也很简单,不过有几个地方需要注意下.这个就不照抄了,咱们也自己写一个. 步骤: ...
- ASP.Net学习笔记002--ASP.Net服务端控件做了什么2
ASP.Net学习笔记002--ASP.Net服务端控件做了什么2 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交 ...
- java学习笔记(三):前端miniUI控件库入门
java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...
- 学习笔记---母板页、用户控件、第三方控件及视图状态管理
一.母版页 在制作页面的过程中, 多个页面往往具有相同的页面Header和页面Footer, 多个页面只是在中间部分有变化. 那么我们完全可以避免在每个页面中都写一遍页头和页尾的代码, 这种技术就是母 ...
- android自定义控件中文乱码,Android笔记--自定义View之组合控件
Android-自定义View 分享是最好的记忆-- 如需转发请注明出处 [强调]:共同学习 共同进步 不喜勿喷 内容简介 前言 实现 总结 1. 前言 这次更新有2个目的 1. 复用控件,而不是每次 ...
- Android学习笔记26:图片切换控件ImageSwitcher的使用
在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...
- Android入门到精通|安卓/Android开发零基础系列Ⅱ【职坐标】-学习笔记(1)-- 常用控件及资源介绍
前言 为了巩固Android基础知识,回顾一下学习内容,才有此学习笔记. IDE Androdi Studio 4 + Genymotion 创建项目 修改项目的 build.gradle,添加国内镜 ...
最新文章
- Pacbio 数据相关的几个重要概念
- [BZOJ4894]天赋
- python | ^ ~
- 一年赚上亿的生意_如何一年不到的时间2万赚10个亿?
- fat32 linux 打包工具_11款最棒的Linux数据恢复工具发布啦!
- 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
- servlet下载文件(注意文件名字必须是英文)
- 【转】C#获取当前日期时间(转)
- Solaris11创建NFS服务
- Eclipse里面导工程的时候报错faceted project problem
- mybatis事物如何避免脏读_新手指南:如何从java电商小白到秒杀大咖
- 利用python处理excel文件并可视化处理-python如何将excel数据处理可视化
- android 水晶报表,水晶报表分组,统计,求和,sum()函数使用
- 文档管理系统 Mayan EDMS安装
- 2021年如何通过网络赚钱
- 制造业必须应用RPA的十大环节
- 量子力学顺口溜_数学的幽默打油诗
- 解决由于权限问题导致YUM安装失败
- hdu1864最大报销额 (01背包)
- 《LoadRunner 12七天速成宝典》目录—导读