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 回答