2012-08-29 10 views
9

Abbiamo un semplice pezzo di codice nella nostra applicazione:In che modo qDebug() stampa i valori enum?

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

Per ragioni che non sono importanti qui stavo tentando di sostituire l'uso di qDebug così ho usato il codice da questo post C++ format macro/inline ostringstream. Ma sono stato sorpreso di scoprire che quando faccio questo stato non appare più come valore di testo ma piuttosto come valore numerico. qDebug() sembra sapere quale sia il nome del valore enum piuttosto che il valore. Come fa questo, e posso fare lo stesso nel mio codice?

risposta

15

Non c'è magia moc qui, QtNetwork definisce esplicitamente l'operatore di rete/presa/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; 
} 

Ma è possibile utilizzare QDebug per inviare i dati ad un QString all'interno vostra funzione:

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

Grazie per il suggerimento - esattamente quello che stavo cercando. – parsley72

8

Forse questo enum a QString convertito può essere utile:

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

Questa sembra una tecnica molto utile. Sfortunatamente, non tutte le enumerazioni sono registrate con moc. Ad esempio, QProcess :: ProcessError è solo un normale enume C++, quindi nessun supporto per convertirlo in un nome :( – tbleher