2012-08-29 39 views
9

私たちは、アプリケーションのコードの簡単な部分を持っている:私はqDebugの使用を置き換えるしようとしていたここでは重要ではありません理由からqDebug()はenum値をどのように出力しますか?

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

はので、私はこの記事C++ format macro/inline ostringstreamからコードを使用していました。しかし、私がこれを行うと、の状態はもはやテキスト値として表示されず、数値として表示されることに気付いた。 qDebug()は列挙型の値の名前が単なる値ではないことを知っているようです。それはどのようにして行いますか?同じコードをコード内で実行できますか?

答えて

15

ここにはmocの魔法はありませんが、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; 
} 

しかし、あなたはあなたの関数内QStringにデータを送信するためにQDebugを使用することができます。

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

これは非常に便利なテクニックのようです。残念ながら、すべてのenumがmocに登録されているわけではありません。例えば、QProcess :: ProcessErrorは普通のC++列挙型なので、それを名前に変換するサポートはありません: – tbleher

関連する問題