2012-08-29 29 views
9

Biz uygulamada basit bir kod parçası var: Ben qDebug kullanımını değiştirmek için uğraş burada önemli değildir nedenlerden dolayıqDebug() yazdırma enum değerleri nasıl?

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

yüzden bu yazı C++ format macro/inline ostringstream kodu kullanılır. Ama ben bu durum yaptığınızda artık bir metin değeri olarak değil, sayısal bir değer olarak göründüğünü bulmak şaşırdı. qDebug(), enum değerinin adının yalnızca değerden ziyade ne olduğunu bilir. Bunu nasıl yapıyor ve aynısını benim kodumda yapabilir miyim?

cevap

15

burada hiçbir moc sihirli yoktur, QtNetwork ağında açıkça operatörü tanımlar/soket/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; 
} 

Ama sen işlevi içinde bir QString veri göndermek için QDebug kullanabilirsiniz:

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

Öneriniz için teşekkürler - tam olarak aradığım şey. – parsley72

8

Belki QString dönüştürmek için bu enum yararlı olabilir:

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

Bu çok kullanışlı bir teknik gibi görünüyor. Ne yazık ki, tüm enumlar moc ile kayıtlı değil. Örneğin, QProcess :: ProcessError sıradan bir C++ enum'dur, bu yüzden bir adı :( – tbleher