QT > 5.11 如何最有效地将 Q_ENUM 转换为 QString?

How to convert Q_ENUM to QString for QT > 5.11 most efficient way?

我阅读了一些关于如何从 Q_ENUM 值中获取实际 QString 的建议。

以下是我想出的 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);
}

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

另一种更优雅的方法是使用 QVariant 的 toString() 方法:

QString errStr = QVariant::fromValue(error).toString();
ui->statusBar->showMessage("Error occured: " + errStr);