zoukankan      html  css  js  c++  java
  • QT枚举类型与字符串类型相互转换

    Qt5以后(具体版本可能是5.10吧,这个不确定)采用以下方法

    https://www.cnblogs.com/dongc/p/5630444.html

    在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了。

    代码示例:

    复制代码
    #include <QtCore/QMetaEnum>
    
    int main() {
        QMetaEnum metaEnum = QMetaEnum::fromType<Qt::Alignment>();
    
        //字符串转枚举值
        Qt::Alignment alignment = (Qt::Alignment)metaEnum.keyToValue("Qt::AlignLeft");
        alignment = (Qt::Alignment)metaEnum.keysToValue("Qt::AlignLeft | Qt::AlignVCenter");
    
        //枚举值转字符串
        const char* s = metaEnum.valueToKey(Qt::AlignCenter);
        return 0;
    }
    复制代码

    在qss中我们可以这样使用枚举类型:

    QTabBar#CustomTabBar {
        /* Qt::AlignmentFlag定义 */
        qproperty-text_align: "AlignLeft | AlignVCenter";
    }

     QT中判断信号是否与槽连接:

    QPushButton btn;
    int receivers = btn.receivers(SIGNAL(clicked(bool));

    qt4.8则采用以下方法:

    https://www.cnblogs.com/FindSelf/p/4901520.html

    一、enum 自省

    1
    2
    3
    const QMetaObject &mo = [ClassName]::staticMetaObject;
    int index = mo.indexOfEnumerator("[EnumName]");
    QMetaEnum me = mo.enumerator(index);

    若 enum 定义在当前类中,则可以简写为

    1
    2
    int index = staticMetaObject.indexOfEnumerator("[EnumName]");
    QMetaEnum me = staticMetaObject.enumerator(index);

    二、enum 转换

    1、 enum <-> int

    1
    enum Color { Red, White, Blue};Color c = (Color)1;   //c=Whiteint i = Red;       //i=0

    2、 enum <-> string

    1
    enum Color { Red, White, Blue};
    1
    QString s = "White";
    1
    int idx = mo.indexOfEnumerator("Color");
    QMetaEnum iEnum = mo.enumerator(idx);
    int val = iEnum.keysToValue(s.toAscii());
    1
    Color c = (Color)val ;

    如果是自定义类中的自定义枚举,如下操作

    class [ClassName]:public QObject
    {
        Q_OBJECT
        Q_ENUMS([EnumName])
    public:
        enum [EnumName]{
            client_1=0,
            client_2,
            client_3,
            client_4
        };
    };

    使用的时候:
                const QMetaObject &mo=[ClassName]::staticMetaObject;
                        int index = mo.indexOfEnumerator("[EnumName]");
                        QMetaEnum metaEnum = mo.enumerator(index);
                const char *c=metaEnum.valueToKey(*****);

    这里注意在class T内声明中添加Q_OBJECT 宏会经常有出现以下错误

    undefined reference to staticMetaObject

    解决办法:
    重新执行qmake,记住每次你添加或者移除Q_GADGET or Q_OBJECT宏,一定要重新执行一遍qmake,问题就解决了。切记!!!

  • 相关阅读:
    input填入字符会出现黄色
    安装Scrapy时出现问题scrapy unicodedecodeerror ascii codec cant decode byte 0xd1 in position
    SVN 出现:Previous operation has not finished; run 'cleanup' if it was interrupted。
    Myeclipse小技巧
    好的开发网站
    BZOJ 1968
    BZOJ 1010
    BZOJ 1015
    BZOJ 3875
    BZOJ 2705
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/8563223.html
Copyright © 2011-2022 走看看