为什么要使用QStringLiteral?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要使用QStringLiteral?相关的知识,希望对你有一定的参考价值。

我最近开始使用QML,我试图关注this example。该视频介绍了如何创建可在QML应用程序中显示的C ++模型。

在模型的数据成员函数中,使用了一个开关,将在QVariant中返回将在QML中显示的字符串,但教程还使用了另外的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();
}

我在没有QStringLiteral的情况下尝试了同样的代码,它运行得很好,所以QStringLiteral的目的是什么?

答案

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; 
    }()) 
    /**/

以上是关于为什么要使用QStringLiteral?的主要内容,如果未能解决你的问题,请参考以下文章

这些 C++ 代码片段有啥作用?

为啥要使用 FrameLayout 作为 FragmentTransaction 的片段容器? [复制]

为啥我必须切换纹理单元才能让我的片段着色器识别要使用的纹理?

为啥要避免片段中的非默认构造函数?

c_cpp 这个简单的代码片段显示了如何使用有符号整数在C中完成插值。 for()循环确定要插入的范围

vim代码片段插件ultisnips的使用