Как 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;
}