12

アプリケーションには簡単なコードがあります。

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

ここでは重要ではない理由で、qDebug の使用を置き換えようとしていたため、このポストC++ フォーマット マクロ / インライン ostringstreamのコードを使用しました。しかし、これを実行すると、この状態がテキスト値ではなく数値として表示されることに驚きました。qDebug() は、値だけでなく、列挙値の名前が何であるかを知っているようです。これはどのように行われますか?私のコードでも同じことができますか?

4

2 に答える 2

21

ここには moc マジックはありません。QtNetwork は、network/socket/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;
}

ただし、関数内QDebugにデータを送信するために使用できます。QString

 QString output;
 QDebug(&output) << ...
于 2012-08-29T09:58:37.647 に答える
10

おそらく、この列挙型から QString への変換が役立つ場合があります。

const QMetaObject & mo = QAbstractSocket::staticMetaObject;
QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("SocketState"));
QString test(me.valueToKey(QAbstractSocket::UnconnectedState));
于 2013-05-05T23:35:07.347 に答える