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