2012-08-29 38 views
9

我們有一段簡單的代碼,在我們的應用程序:qDebug()如何打印枚舉值?

void tAccessPoint::OnStateChanged(QAbstractSocket::SocketState state) 
{ 
    qDebug() << m_ID << " " << state; 

對於這裏並不重要的原因,我試圖取代使用qDebug的,所以我使用的代碼從這個職位C++ format macro/inline ostringstream。但我很驚訝地發現,當我這樣做時狀態不再顯示爲文本值,而是作爲數值顯示。 qDebug()似乎知道枚舉值的名稱是什麼,而不僅僅是值。它如何做到這一點,我可以在我的代碼中做同樣的事情嗎?

回答

15

這裏沒有魔法交通部,QtNetwork明確定義的運營商網絡/插座/ qabstractsocket.h:

QDebug operator<<(QDebug, QAbstractSocket::SocketState) { 
    switch (state) { 
    case QAbstractSocket::UnconnectedState: 
     debug << "QAbstractSocket::UnconnectedState"; 
     break; 
    case QAbstractSocket::HostLookupState: 
     debug << "QAbstractSocket::HostLookupState"; 
     break; 
    case QAbstractSocket::ConnectingState: 
     debug << "QAbstractSocket::ConnectingState"; 
     break; 
    case QAbstractSocket::ConnectedState: 
     debug << "QAbstractSocket::ConnectedState"; 
     break; 
    case QAbstractSocket::BoundState: 
     debug << "QAbstractSocket::BoundState"; 
     break; 
    ... 
    return debug; 
} 

但是你可以用QDebug送你的函數裏面的數據到QString

QString output; 
QDebug(&output) << ... 
+0

感謝您的建議 - 正是我一直在尋找的。 – parsley72

8

也許這枚舉QString的轉換可能是有用的:

const QMetaObject & mo = QAbstractSocket::staticMetaObject; 
QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("SocketState")); 
QString test(me.valueToKey(QAbstractSocket::UnconnectedState)); 
+2

這看起來像一個非常有用的技術。不幸的是,並非所有的枚舉都是通過moc註冊的。例如,QProcess :: ProcessError只是一個普通的C++枚舉,所以不支持將其轉換爲名稱:( – tbleher