我阅读了一些有关如何从QString
值中获取实际Q_ENUM
的建议。
下面我提出了3种可能的方法,它们是QT5.11.1中的可编译结构
一个人应该偏爱什么?为什么?
void MainWindow::setErrorText(QCanBusDevice::CanBusError error)
{
QString errorString;
QDebug(&errorString) << error;
ui->statusBar->showMessage("Error occured: " + errorString);
// QT4 ?
const QMetaObject& mo = QCanBusDevice::staticMetaObject;
QMetaEnum me = mo.enumerator(mo.indexOfEnumerator("CanBusError"));
QString errorStr(me.valueToKey(QCanBusDevice::UnconnectedState));
ui->statusBar->showMessage("Error occured: " + errorStr);
// From QT5?
QString errorS(QMetaEnum::fromType<QCanBusDevice::CanBusError>().valueToKey(error));
ui->statusBar->showMessage("Error occured: " + errorS);
}
答案 0 :(得分:3)
QDebug
应该用于日志记录和调试。 QDebug
构造了一个QTextStream
,并且对于您要执行的操作来说非常昂贵。
使用QMetaEnum
是正确的。您不应该像这样进行字符串连接,对于用户可见的字符串,请使用tr
,或者在其他位置使用QStringLiteral
而不是tr
const auto errStr = QMetaEnum::fromType<QCanBusDevice::CanBusError>().valueToKey(error);
ui->statusBar->showMessage(tr("Error occured: %1").arg(errStr));
答案 1 :(得分:1)
另一种更优雅的方法是使用QVariant的toString()方法:
QString errStr = QVariant::fromValue(error).toString();
ui->statusBar->showMessage("Error occured: " + errStr);