2012-08-29 23 views
9

Tenemos un simple trozo de código en nuestra aplicación:¿Cómo imprime qDebug() valores enum?

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

Por razones que no son importantes aquí, yo estaba tratando de reemplazar el uso de qDebug por lo que utiliza el código de este post C++ format macro/inline ostringstream. Pero me sorprendió descubrir que cuando hago esto, el estado ya no aparece como un valor de texto, sino más bien como un valor numérico. qDebug() parece saber cuál es el nombre del valor enum en lugar de solo el valor. ¿Cómo hace esto, y puedo hacer lo mismo en mi código?

Respuesta

15

No hay magia aquí moc, QtNetwork define explícitamente el operador de red/toma/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; 
} 

Pero puede utilizar QDebug para enviar los datos a un QString dentro de su función:

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

Gracias por la sugerencia, exactamente lo que estaba buscando. – parsley72

8

Tal vez esta enumeración para convertir QString puede ser útil:

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

Esto parece una técnica muy útil. Desafortunadamente, no todas las enumeraciones están registradas con moc. Por ejemplo, QProcess :: ProcessError es simplemente una enum normal de C++, por lo que no admite la conversión a un nombre :( – tbleher