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,問題就解決了。切記!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM