网站首页 > 编程文章 正文
学习之前我们先补习一下枚举和或运算的基础
枚举:
枚举类型(Enum Types)是一种用户定义的数据类型,用于表示具名的整数常量。枚举类型可以帮助提高代码的可读性,使程序更易于理解。
以下是一些使用枚举类型的典型情况:
代替魔法数值: 枚举类型可以用于替代代码中的魔法数值(Magic Numbers)。例如,假设你的程序中有一个表示星期的整数,你可以使用枚举类型:
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
这样你的代码中就可以使用 Weekday 枚举来表示星期,而不是使用 0 到 6 之间的数字。
有限的选项集: 当你的变量只能有有限的一组选项时,使用枚举类型可以提高代码的清晰度。例如,表示颜色的枚举:
enum Color {
Red,
Green,
Blue,
Yellow,
// ...
};
这样你可以使用 Color 枚举来表示颜色,而不是使用数字或字符串。
在以上代码中这个Weekday和Color是枚举类型,其中Red或者Sunday是枚举常量
枚举类型与或运算
枚举类型的或运算通常用于创建一个组合值,其中一个枚举值的位被设置。这在处理一组选项或标志时非常有用。以下是一个简单的例子:
假设有一个表示文件权限的枚举类型:
enum FileAccess { Read = 1, Write = 2, Execute = 4 };
现在,假设你有一个文件,你想给它读和写的权限:
FileAccess myFilePermissions = Read | Write;
在这里,| 是按位或运算符,用于将 Read 和 Write 枚举值的对应位进行组合。现在,myFilePermissions 的值是 Read | Write 的组合,它的二进制表示为11;所以值就是十进制的3
计算过程
关键词复习:组合值(类型枚举的组合)(或运算)这种逻辑运算有时候也叫做位掩码(bitmasks)
进入正题QFlags:
首先说一下普通枚举得缺点:
QFlags<Enum>类是一个模板类,其中Enum是枚举类型。QFlags在Qt中用于存储枚举值的组合。
用于存储或组合枚举值的传统C++方法是使用整型变量。这种方法的不便之处在于根本没有类型检查,任何枚举值都可以与任何其他枚举值进行逻辑运算。
enum Orientation
{
Up = 1,
Down = 2,
Left = 4,
Right = 8,
};
enum Direction
{
horizontal = 2,
vertical = 3,
};
这两种操作编译器不会报错:
Orientation::Up | Direction::horizontal;
Orientation::Up | Orientation::Down;
第一种两个不相关的枚举值做逻辑运算没有意义,第二种运算结果是3,但Orientation中没有值是3的标识符。
在Qt6中c++开发指南中是这样介绍QFlags的:
QFlags<Enum>是一个模板类,其中Enum是枚举类型,QFlags用于定义枚举值的或运算组合,在Qt中经常用到 QFlags 类。例如,QLabel 有一个alignment 属性,其读写函数分别定义如下:
Qt::Alignment alignment()
void setAlignment(Ot::Alignment)
alignment属性值是Qt:Alignment类型Qt帮助文档中显示的Qt::Alignment信息有如下表示
enum Qt::AlignmentFlag //枚举类型
flags Qt::Alignment //标志类型
第一行代码翻译一下就是Qt命名空间下的有一个变量名字叫做AlignmentFlag他是枚举类型
【粉丝福利】Qt开发学习资料包、大厂面试题、项目视频、学习路线,包括(Qt C++基础,数据库编程,Qt项目实战、Qt框架、QML、Opencv、qt线程等等)有需要的可以进企鹅裙937552610领取哦~
这表示Qt::Alignment是QFlags<Qt::AlignmentFlag>类型,但是Qt中并没有定义实际的类型Qt::Alignment,也就是不存在如下的定义:
这样的定义实际不存在
typedef QFlags<Qt::AlignmentFlag> Qt::Alignment;
Qt::AlignmentFlag 是枚举类型,其有一些枚举常量。
如:
详见Qt文档。
Ot::Alignment是一个或多个Qt:AlignmentFlag类型枚举值的组合,是一种特性标志。
即Alignment可以是 AlignLeft | AlignRight
也可以是 AlignHCenter | AlignLeft所以我们把Qt::Alignment称为枚举类型Qt::AlignmentFlag的标志类型。
给窗口上的OLabel组件label 设置对齐方式,可以使用如下的代码
ui->label->setAlignment(Qt::AlignLeft lQt::AlignVCenter);
这实际上是创建了一个Qt::Alignment类型的临时变量,相当于如下的代码:
QFlags<Qt::AlignmentFlag> flags = Qt::AlignLeft | Qt::AlignVCenter;
ui->label->setAlignment(flags);
看这段代码并有没有写Qt::Alignment = Qt::AlignLeft | Qt::AlignVCenter;
也可以看出实际并没有Qt::Alignment,他只是一个标志。
QFlags 类支持或、与、异或等位运算,所以也可以这样写代码\
QFlags<Qt::AlignmentFlag> flags= ui->label->alignment();//获取alignment 属性值
flags = flags | Qt::AlignVCenter;//增加垂直对齐
u1->label->setAlignment(flags);//设置alignment 属性值
这里主要是要区分帮助文档中enum Qt:AlignmentFlag 和flags Qt::Alignment的意义,不要把QLabel的setAlignment()函数的输入参数认为是枚举类型,它实际上是标志类型。
QFlags类有一个函数testFlag()可以测试某个枚举值是否包含在此标志变量中,例如:
//获取alignment 属性值//是否包含
QFlags<Ot;:AlignmentFlag> flags= ui->label->alignment();
bool isLeft = flags.testFlag(Qt::AlignLeft);
Qt使用QFlags来提供类型安全性。
如果要对自己的枚举类型使用QFlags,应使用Q_DECLARE_FLAGS()和Q_DECLARE_OPERATORS_FOR_FLAGS()。
例:
class MyClass
{
public:
enum Orientation
{
Up = 1,
Down = 2,
Left = 4,
Right = 8,
};
Q_DECLARE_FLAGS(Orientations, Orientation)
...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Orientations)
这样为枚举Orientation创建了一个Flags:Orientations,这个Orientations的类型就是QFlags<MyClass::Orientation>。可以用Orientations对象接收逻辑运算的值了:
Orientations f = Orientation::Up | Orientation::Down;
猜你喜欢
- 2024-10-14 「Qt入门第31篇」 网络(一)Qt网络编程简介
- 2024-10-14 qt 做手机android的串口通讯 qt下串口通信
- 2024-10-14 Qt 读写txt文本文件(qt读入文件)
- 2024-10-14 Qt 信号槽连接不成功问题原因汇总
- 2024-10-14 QML 性能优化建议(一)(qml例程)
- 2024-10-14 C++ QT中文件的读写操作(UI界面)(qt怎么读取文件内容)
- 2024-10-14 Qt 中的智能指针(qt 函数指针)
- 2024-10-14 Qt如何读取和写入配置文件的数据(qt 读写配置文件)
- 2024-10-14 Qt pro文件中的常用宏说明(qt pro 自定义宏)
- 2024-10-14 Qt应用程序主窗口:拖放操作与打印文档
你 发表评论:
欢迎- 05-09Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 05-09《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- 05-09MapStruct架构设计(mapstruct @mapping)
- 05-09分布式微服务架构组件(分布式微服务架构设计)
- 05-09Java Swing组件下的JButton实例(java swing 组件)
- 05-09java基础都在这了,小主们拿去吧(java基础是指什么)
- 05-09AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 05-09【Spring Boot】WebSocket 的 6 种集成方式
- 最近发表
-
- Spring Boot3 RESTful 接口参数校验,这篇吃透就够了!
- 《Spring6》第02节:基于XML方式搭建Spring6框架开发环境
- MapStruct架构设计(mapstruct @mapping)
- 分布式微服务架构组件(分布式微服务架构设计)
- Java Swing组件下的JButton实例(java swing 组件)
- java基础都在这了,小主们拿去吧(java基础是指什么)
- AOP的实现落地(拦截过滤),一切都要从Servlet说起
- 【Spring Boot】WebSocket 的 6 种集成方式
- Java 中五种最常见加密算法:原理、应用与代码实现
- 用注解进行参数校验,spring validation介绍、使用、实现原理分析
- 标签列表
-
- spire.doc (59)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- sqljdbc4.jar下载 (56)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- 苹果ios字体下载 (56)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)