2017-12-28 33 views
0

Ich begann vor kurzem mit QML und ich versuchte zu folgen this example. In diesem Video erfahren Sie, wie Sie ein C++ - Modell erstellen, das in Ihrer QML-Anwendung angezeigt werden kann.Warum QStringLiteral verwenden?

In der Datenelementfunktion des Modells wird ein Schalter verwendet und die Zeichenfolge, die in QML angezeigt wird, wird in QVariant zurückgegeben, aber das Lernprogramm verwendet auch einen zusätzlichen QStringLiteral, wie Sie im folgenden Code sehen können.

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

habe ich versucht, das gleiche Stück Code ohne QStringLiteral und es funktionierte gut, so was ist der Zweck des QStringLiteral ist?

+0

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

+2

Die Antwort für diese Art von Fragen sind immer in der Dokumentation: http://blog.qt.io/blog/2014/06/13/qt-wöchentlich-13-qstringliteral / – eyllanesc

Antwort

1

Was ist der Zweck des QStringLiteral?

QString ist eine interessante String-Klasse, die sowohl mit statisch als auch dynamisch zugewiesenen Zeichenfolgen arbeiten kann. Die dynamische Zuweisung ist sowohl hinsichtlich der Codegröße als auch hinsichtlich der Leistung teurer, jedoch flexibler und in der Regel praktikabel. Wie auch immer, für wenn Sie nur einmal eine Zeichenkette brauchen und das wird sich nicht ändern Qt hat ein Makro QStringLiteral, das die Zeichenkette statisch zuweist und es als Puffer dem QString getippten Objekt zuweist. Wenn das Objekt QString nicht mit einem neuen String zugewiesen wurde, wird der vorhandene Puffer verwendet.

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