2017-12-28 28 views
0

私は最近QMLで始まり、this exampleに従いました。このビデオは、QMLアプリケーションで表示できるC++モデルの作成方法を説明しています。なぜQStringLiteralを使用しますか?

モデルのデータメンバー関数では、スイッチが使用され、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(); 
} 

私はQStringLiteralせずにこのコードの同じ部分を試してみましたが、それがうまく働いていたので、何がQStringLiteralの目的ですか?

+0

http://doc.qt.io/qt-5/qstring.html#QStringLiteral – arrowd

+2

質問これらのタイプのための答えは、マニュアルに常にある:http://blog.qt.io/blog/2014/06/13/qt-weekly-13-qstringliteral / – eyllanesc

答えて

1

QStringLiteralの目的は何ですか?

QStringは、静的に割り当てられた文字列と動的に割り当てられた文字列の両方で操作できる興味深い文字列クラスです。動的割り当ては、コードサイズとパフォーマンスの両方で高価ですが、柔軟性が高く、通常は実用的です。とにかく、文字列を一度しか必要とせず、それが変更されない場合Qtには、文字列を静的に割り当てて、QString型付きオブジェクトへのバッファとして割り当てるマクロQStringLiteralがあります。新しい文字列を割り当てた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; \ 
    }()) \ 
    /**/ 
関連する問題