为什么要使用 QStringLiteral?

Lin*_*inG 4 c++ qt qml

我最近开始使用 QML,并尝试遵循此示例。该视频介绍了如何创建可在 QML 应用程序中显示的 C++ 模型。

在模型的数据成员函数中,使用了一个开关,将在 QML 中显示的字符串在 QVariant 中返回,但本教程还使用了一个额外的 QStringLiteral,如下面的代码所示。

QVariant ToDoModel::data(const QModelIndex &index, int role) const
{
  if (!index.isValid())
    return QVariant();

  // FIXME: Implement me!
  switch (role)
  {
  case DoneRole:
    return QVariant(false);
  case DescriptionRole:
    return QVariant(QStringLiteral("Test description"));
  }
  return QVariant();
}
Run Code Online (Sandbox Code Playgroud)

我在没有 QStringLiteral 的情况下尝试了同样的一段代码,它工作得很好,那么 QStringLiteral 的目的是什么?

Ale*_*r V 7

QStringLiteral 的目的是什么?

QString是一个有趣的字符串类,能够处理静态和动态分配的字符串。动态分配在代码大小和性能方面都更昂贵,但更灵活且通常更实用。无论如何,当您只需要一个字符串并且不会改变时,Qt 有一个宏QStringLiteral,它静态分配字符串并将其作为缓冲区分配给QString类型化对象。除非QString使用新字符串分配该对象,否则将使用现有缓冲区。

#define QT_UNICODE_LITERAL(str) QT_UNICODE_LITERAL_II(str)
#define QStringLiteral(str) \
    ([]() Q_DECL_NOEXCEPT -> QString { \
        enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
        static const QStaticStringData<Size> qstring_literal = { \
            Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
            QT_UNICODE_LITERAL(str) }; \
        QStringDataPtr holder = { qstring_literal.data_ptr() }; \
        const QString qstring_literal_temp(holder); \
        return qstring_literal_temp; \
    }()) \
    /**/
Run Code Online (Sandbox Code Playgroud)