2012-08-29 15 views
9

Mamy prosty kawałek kodu w naszej aplikacji:W jaki sposób qDebug() wyświetla wartości wyliczone?

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

Z powodów, które nie są tu ważne, że usiłował zastąpić użycie qDebug więc użyłem kodu z tego postu C++ format macro/inline ostringstream. Zaskoczyło mnie jednak to, że kiedy to robię, stan stan nie jest już wyświetlany jako wartość tekstowa, ale raczej jako wartość liczbowa. qDebug() wydaje się wiedzieć, jaka jest nazwa wartości wyliczeniowej, a nie tylko wartość. Jak to robi i czy mogę zrobić to samo w moim kodzie?

Odpowiedz

15

Nie ma moc magiczna tutaj, QtNetwork definiuje wyraźnie operatorowi sieci/gniazda/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; 
} 

Ale można użyć QDebug wysłać dane do QString wewnątrz funkcji:

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

Dzięki za sugestię - dokładnie to, czego szukałem. – parsley72

8

może to enum do QString nawróconego mogą być przydatne:

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

To wygląda na bardzo przydatną technikę. Niestety, nie wszystkie przeliczenia są zarejestrowane z mocą. Na przykład QProcess :: ProcessError to zwykłe wyliczenie C++, więc nie ma potrzeby przekształcania go w nazwę :( – tbleher

Powiązane problemy