Как qDebug() печатает значения enum?

В нашем приложении есть простой фрагмент кода:

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

По причинам, которые здесь не важны, я пытался заменить использование qDebug, поэтому я использовал код из этого сообщения макрос формата С++/встроенный ostringstream. Но я с удивлением обнаружил, что когда я делаю это состояние больше не отображается как текстовое значение, а скорее как числовое значение. qDebug(), похоже, знает, что имя значения перечисления, а не просто значение. Как это сделать, и могу ли я сделать то же самое в своем коде?

Ответ 1

Здесь нет moc-магии, QtNetwork явно определяет оператор в сети /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) << ...

Ответ 2

Возможно, это перечисление для преобразования QString может быть полезно:

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

Ответ 3

попробуй так,

enum class MyEnum {
   Unknown,
   DoorIsOpen,
   DoorIsClosed,
};
Q_ENUM_NS(MyEnum)
int main() {
    qDebug() << MyEnum::DoorIsOpen;
}