我们的应用程序中有一段简单的代码:
void tAccessPoint::OnStateChanged(QAbstractSocket::SocketState state)
{
qDebug() << m_ID << " " << state;
Run Code Online (Sandbox Code Playgroud)
由于这里不重要的原因,我试图替换qDebug的使用,所以我使用了这个后C++格式宏/内联ostringstream的代码.但我惊讶地发现,当我这样做时,状态不再显示为文本值,而是显示为数值.qDebug()似乎知道枚举值的名称而不仅仅是值.它是如何做到的,我可以在我的代码中做同样的事情吗?
ale*_*sdm 20
这里没有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;
}
Run Code Online (Sandbox Code Playgroud)
但您可以使用QDebug将数据发送到QString函数内部:
QString output;
QDebug(&output) << ...
Run Code Online (Sandbox Code Playgroud)
小智 9
也许这个QString转换的枚举可能很有用:
const QMetaObject & mo = QAbstractSocket::staticMetaObject;
QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("SocketState"));
QString test(me.valueToKey(QAbstractSocket::UnconnectedState));
Run Code Online (Sandbox Code Playgroud)