MFC中使用Qt
简述
最近在处理一个MFC中嵌入Qt窗口,所遇到的一些问题。进行总结,对一些问题进行分析理解,提炼出自己的看法。
- qtwinmigrate
- GraphicsView框架事件处理
- 字符集,文件编码
qtwinmigate
由于MFC和QT的消息循环机制不同,Qt所实现的功能不能直接使用在MFC/Win32上。
qtwinmigate是一个Qt官方的解决方案。该方案提供了一组允许使用Qt和MFC / Win32窗口在同一个应用程序中。用户界面元素用Qt开发的可以嵌入到现有的MFC或Win32中基于用户界面,以及使用开发的现有自定义控件MFC或Win32可以集成到Qt小部件中。
官方地址 https://github.com/qtproject/qt-solutions/tree/master/qtwinmigrate
GraphicsView框架事件处理
简述 Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放。这个柜架也包含一个事件传播结构,对于在scene中的这些items,它具有双精度的交互能力。 Items能处理键盘事件,鼠标的按,移动、释放、双击事件,也可以跟踪鼠标移动。Graphics View使用BSP树来提供对item的快速查找,使用这种技术,它可以实时地绘制大规模场景,甚至以百万items计。
事件传递 图形视图框架中的事件都是首先由视图进行接收,然后传递给场景,再由场景传递给相应的图形项。而对于键盘事件,它会传递给获得焦点的图形项,可以使用QGraphicsScene类的setFocusItem()函数或者图形项自身调用setFocus()函数来设置焦点图形项。默认的,如果场景没有获得焦点,那么所有的键盘事件都会被丢弃。场景中的图形项获得了焦点,场景也会自动获得焦点。
对于鼠标悬停效果,QGraphicsScene会调度悬停事件。如果一个图形项可以接收悬停事件,那么当鼠标进入它的区域之中时,它就会收到一个GraphicsSceneHoverEnter事件。如果鼠标继续在图形项的区域之中进行移动,那么QGraphicsScene就会向该图形项发送GraphicsSceneHoverMove事件。当鼠标离开图形项的区域时,它将会收到一个GraphicsSceneHoverLeave事件。图形项默认是无法接收悬停事件的,可 以使用QGraphicsItem类的setAcceptHoverEvents()函数使图形项可以接收悬停事件。所有的鼠标事件都会传递到当前鼠标抓取的图形项,一个图形项如果可以接收鼠标事件(默认可以)而且鼠标在它的上面被按下,那么它就会成为场景的鼠标抓取的图形项。
参考文献 Qt的QGraphicsView框架
字符集,文件编码
首先先简单说一下Unicode和utf-8,因为大多时候多遇见这两个词。
Unicode 是「字符集」
UTF-8 是「编码规则」
其中:字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
根据上表中的编码规则,之前的「知」字的码位 U+77E5 属于第三行的范围:
7 7 E 5
0111 0111 1110 0101 二进制的 77E5
--------------------------
0111 011111 100101 二进制的 77E5
1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
11100111 10011111 10100101 代入模版
E 7 9 F A 5
这就是将 U+77E5 按照 UTF-8 编码为字节序列 E79FA5 的过程。反之亦然。
(待续)
参考资料
推荐阅读
-
iOS中UIRefreshControl的基本使用详解
-
.NET Framework中定时器timer的单线程与多线程使用讲解
-
C#中backgroundworker的使用教程
-
Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能
-
分享Android中pullToRefresh的使用心得
-
JAVA中JNI的简单使用分享
-
使用IntelliJ IDEA 2017.2.5 x64中的Spring Initializr插件快速创建Spring Boot/Cloud工程(图解)
-
ES6中字符串的使用方法扩展
-
ai中怎么使用画板工具绘制图形?
-
使用jsoup解析html的table中的文本信息实例