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



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

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

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

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

最新更新