QT 的自省如何使用

有人提问: 请问如何将enum的成员存放到一个QStringList中? 最近看到有人研究,所以顺便分分析
这个靠 std c++ 是很难做到的,但Qt引入一个 meta-object system ,情况就不一样了:meta-object system提供了信号-槽以及内省(introspection)。

要利用该功能,首先子类化 QObject 并添加 Q_OBJECT 宏,然后根据需要还可能需要 Q_PROPERTY, Q_ENUMS, Q_SIGNAL, Q_SLOT, 等等

//filename: main.cpp

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QStringList>
#include <QtCore/QMetaEnum>

class TestClass : public QObject
{
    Q_OBJECT 
    Q_ENUMS(MyEnum)

public:
    enum MyEnum{A, B, C, D, E};

TestClass(QObject * parent = 0):QObject(parent)
    {
        int index = metaObject()->indexOfEnumerator("MyEnum");
        QMetaEnum myEnum = metaObject()->enumerator(index);
        for (int i=0; i<myEnum.keyCount(); ++i)
        {
            m_myEnumList << myEnum.key(i);
        }
        qDebug()<<m_myEnumList;
    }

private:
    QStringList m_myEnumList;
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    TestClass t;

return a.exec();
}

当然,如果我们只是需要 Q_ENUMS 的话,我们并不需要子类化QObject,普通的C++类也可以。 由于不是QObject 的子类,不能使用 Q_OBJECT 宏,为了利用 meta-object system,我们需要使用宏 Q_GADGET

//filename: main.cpp

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QStringList>
#include <QtCore/QMetaEnum>
class TestCppClass
{
    Q_GADGET
    Q_ENUMS(MyEnum)
public:
    enum MyEnum{AA, BB, CC, DD, EE};
    TestCppClass()
    {
        QMetaEnum myEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("MyEnum"));
        for (int i=0; i<myEnum.keyCount(); ++i)
        {
            m_myEnumList << myEnum.key(i);
        }
        qDebug()<<m_myEnumList;
    }

private:

QStringList m_myEnumList;
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    TestCppClass t;

return a.exec();
}

时间: 2024-10-09 22:33:53

QT 的自省如何使用的相关文章

C++Qt代码转PyQt代码指南

Table of Contents 1 举个栗子 #include <QApplication> #include <QtGui> #include <QtCore> C++代码 int main(int argc, char *argv[]) { QApplication app(argc, argv); QSplitter *splitter = new QSplitter;//QSplitter用户分割两个widget QFileSystemModel *mode

Qt元对象(Meta-Object)系统与反射

反射 -在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意术语“反射”和“内省”(type introspection)的关系.内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测:反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构. C++的反射 C++的标准语法是不提供反射的特性的,不

Qt编译好的OCI驱动下载

在上文,我累赘了一大堆,给大家写了一篇Qt如何编译OCI驱动,在这里自然就不再累赘了,直接附上编译好的文件供大家下载: <Qt5.3.1+OCI驱动下载地址> 有经济来源的请传送:http://download.csdn.net/detail/u012433546/9922424 无经济来源的请传送:链接:http://pan.baidu.com/s/1boKG9lH 密码:7yj5 <Qt5.3.2+OCI驱动下载地址> 有经济来源的请传送:http://download.csd

Qt线程的简单使用(一)

Qt中线程的一种创建方式,就是使用QObject::moveToThread()函数.如下,直接上源代码,可以把费时的任务放到doWork()方法里进行,不阻塞主线程. 1 #ifndef WORKER_H 2 #define WORKER_H 3 4 #include <QObject> 5 6 class Worker : public QObject 7 { 8 Q_OBJECT 9 10 public: 11 Worker(); 12 ~Worker(); 13 public slot

第三十八课、Qt中的事件处理(上)

一.图形界面应用程序的消息处理模型 二.Qt的事件处理 1.Qt平台将系统产生的消息转换为Qt事件(每一个系统消息对象Qt平台的一个事件) (1).Qt事件是一个QEvent的对象 (2).Qt事件用于描述程序内部或者外部发生的动作 (3).任意的QObject对象都具备事件处理的能力 2.GUI应用程序的事件处理方式 (1).Qt事件产生后立即被分发到QWidget对象 (2).QWidget中的event(QEvent*)进行事件处理 (3).event()根据事件类型调用不同的事件处理函数

MISP版本嵌入式QT编译时出现mips-linux-gcc command not found

configure的时候都没什么问题我的configure是:./configure -prefix /opt/qt-jz -xplatform qws/linux-mips-g++ -embedded mips  configure顺利的过了,但是当make的时候,出现了mips-linux-gcc :Commond not fount! 我装的是mipsl-linux-gcc ,而且已经交叉编译过了个hello world了.. make时出现的错误是:make[1]: Entering d

Qt在Mac OS X下的编程环境搭建(配置Qt库和编译器,有图,很清楚)

尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要配置Qt库和编译器.编译器只能使用苹果公司自主研发的Clang.1.分别下载并安装XCode和Command Line Tools(必须安装),安装完毕后,Clang就有了. https://developer.apple.com/downloads/ 2.下载Qt并默认安装 http://down

让Qt在MIPS Linux上运行 good

下载 首先下载Qt everywhere,当前的版本是4.7.2,可以从nokia的网站上下载,也可以从git服务器上下载.考虑到文件有200M 以上的大小,下载速率低于25kBPS的,需要考虑从什么地方复制一份,否则需要等待较长时间才能下载下来.我是在家里下载这个文件的,所以开始编译已经是第二天了.考虑提升员工效率的话,需要预先预备好这些下载文件,或者增加接入带宽. 解压 第一步下载的文件是一个tar包,所以需要解压,通常解压需要在unix/Linux环境下进行,如果只是看代码,windows

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

最近在做一个网络音乐播放器时,由于出现qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method, 而不能播放网络歌曲. 上网搜了半天,都说要在电脑那里安装openssl,然后把C:\OpenSSL-Win64\bin下的libeay32.dll和ssleay32.dll拷贝到D:\Qt\Qt5.4.2\5.4\mingw491_32\bin, 然而并没什么卵用! 我的解决办法是: Qt的这个目