如何为QT> 5.11最有效的方法将Q_ENUM转换为QString?

时间:2018-11-08 13:14:05

标签: qt qt5 qstring qmetaobject

我阅读了一些有关如何从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);
}

2 个答案:

答案 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);