QT元编程----Q_ENUMS

头文件中定义枚举类型并设置Q_ENUMS

#ifndef TEST_H
#define TEST_H

#include <QObject>
#include <QMetaEnum>

class Test : public QObject
{
Q_OBJECT
Q_ENUMS(TestType) //[1]

public:
explicit Test(QObject *parent = nullptr);

enum TestType
{
TEST_ONE,
TEST_TWO,
TEST_THREE
};

signals:

public slots:
void DoTest(QString command);
};

#endif // TEST_H

源文件中的调用方式:

#include "test.h"
#include <QDebug>

Test::Test(QObject *parent) : QObject(parent)
{

}

void Test::DoTest(QString command)
{
//[2] QMetaObject是用来保存Qt元对象的元信息,当继承QObject类并使用宏Q_OBJECT时,创建的类产生一个静态QMetaObject实例staticMetaObject,这个实例会保存类名、信号名称及索引、槽的名字及索引等等在对象操作时需要的基本信息

QMetaObject object = this->staticMetaObject; 
QMetaEnum MeteEnum = object.enumerator(
object.indexOfEnumerator("Tests")); //[3]
switch (MeteEnum.keysToValue(command.toLatin1())) //[4]
{
case TEST_ONE:
qDebug() << "TEST 1";
break;
case TEST_TWO:
qDebug() << "TEST 2";
break;
case TEST_THREE:
qDebug() << "TEST 3";
break;
default:
qDebug() << "TEST NONE";
break;
}
}

测试程序调用类:

#include <QCoreApplication>
#include "test.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test cTest;
cTest.DoTest(QString("sfe"));
cTest.DoTest(QString("TEST1"));
return a.exec();
}

原文地址:https://www.cnblogs.com/svenzhang9527/p/10806957.html

时间: 2024-10-14 18:36:01

QT元编程----Q_ENUMS的相关文章

Qt元对象系统源码解析

Qt元对象系统源码解析 https://blog.51cto.com/9291927/2070348 一.Qt元对象系统简介 1.元对象系统简介 Qt 的信号槽和属性系统基于在运行时进行内省的能力,所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果语言具有运行期间检查对象型别的能力,那么是型别内省(type intropection)的,型别内省可以用来实施多态.C++的内省比较有限,仅支持型别内省, C++的型别内省是通过运行时类型识别(RTTI)(Run-Time Typ

C++模板元编程 - 2 模仿haskell的列表以及相关操作

这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D>>>的设计要好看不少. List有一个很巧妙的继承,只有那么做才能使用类似于List<>::Rest的写法,直接定义成template<typename T, typename... TArgs>List是不行的. Change这里可以给一个args...换另一个包装,这里

《Effective C++》:条款48:认识template元编程

Template metaprogramming(TMP,模板元编程)是编写template-based C++程序,编译的过程.template metaprogramming是用C++写的模板程序,编译器编译出具体化的过程.也就是说,TMP程序执行后,从templates具体化出来C++源码,不再是模板了. TMP有两个作用,一是它让某些事更容易.例如编写STL容器,使用模板,可是存放任何类型元素.二是将执行在运行期的某些工作转移到了编译期.还有一个结果是使用TMP的C++程序可能在其他方面

qt socket编程

dialog.c #include <QtGui> #include <QtNetwork> #include <QFile> #include <QDir> #include <stdlib.h> #include "dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent) { tcpSocket = new QTcpSocket(this); timer1=ne

QT核心编程之调试技术 (g)

Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考DDD的帮助文档. AD:51CTO首届中国APP创新评选大赛正在招募>> QT核心编程之调试技术是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(D

C++拾遗--模板元编程

C++拾遗--模板元编程 前言 模板元是用于递归加速的,把运行期的函数调用变到编译期进行代码展开,类似于内联函数.下面看一个实例:斐波那契数列第n项求解. 模板元编程 #include <iostream> #include <ctime> using namespace std; //递归法 int fib(int n) { if (n < 0) return 0; if (n == 1 || n == 2) return 1; return fib(n - 1) + fi

模板元编程

//模板元把运行时消耗的时间,在编译期间优化 //递归极其消耗时间 1 #include <iostream> 2 3 //模板元把运行时消耗的时间,在编译期间优化 4 //递归极其消耗时间 5 6 template <int N> 7 struct data 8 { 9 enum { res = data<N - 1>::res + data<N - 2>::res }; 10 }; 11 12 template <> 13 struct da

初识C++模板元编程(Template Mega Programming)

前言:毕设时在开源库上做的程序,但是源码看得很晕(当时导师告诉我这是模板元编程,可以不用太在乎),最近自己造轮子时想学习STL的源码,但也是一样的感觉,大致了解他这么做要干什么,但是不知道里面的机制.于是开始学习<C++模板元编程>,看完第二章对一些东西豁然开朗. PS:该书也有点老了,C++11标准还没出来,主要用的Boost库. Traits(特征) 说正题,在STL中经常可以见到后缀为traits的名字,比如经常用到的std::string,本质是类模板basic_string的第一个参

浅析 Qt 元类型(MetaType)注册

本文介绍的是 Qt 元类型(MetaType)注册,请先来看内容. QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().) 其中ERROR_LEVEL只是我定义的枚举类型即enum ERROR_LEVEL.然后在Qt的信号-槽函数的参数中使用了这个枚举型,在发送信号时就出现了上述警告.上面警告的