我最近开始使用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; \
}()) \
/**/