2013-06-20 3 views
1

У меня есть кодовая база STL, которую нужно разделить между приложением QtQuick 2.0 (графический интерфейс) и чисто STL-приложением (сервером). Интерфейс может выводить свои классы из общей кодовой базы STL, поэтому он может иметь Q_PROPERTY s, сигналы, слоты и т. Д., Но общие структуры данных должны оставаться STL-only.Использование std :: string в QML

Я хотел бы избежать дублирования данных (std::string ->QString и т.д.), так что я пытался использовать std::string непосредственно в системе Q_PROPERTY. Использование Q_DECLARE_METATYPE(std::string) и qRegisterMetaType<std::string>(); и объявляя свойства, как:

Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged) 

делает мой код компилируется, но QML до сих пор не любит std::string с.

Дать текстовое поле с:

Text 
{ 
text: myserviceinterface.stldata 
} 

выдаст предупреждение о том, Unable to assign std::string to QString, в то время как добавление существующей строки QML:

Text 
{ 
text: "text: " + myserviceinterface.stldata 
} 

делает управление Text отображения странно QVariant(std::string).

Что я делаю неправильно?

ответ

5

Я боюсь, что вы не можете использовать std::string непосредственно в QML, вам нужно сначала преобразовать его в QString.

В общем, вы можете экспортировать только два типа C++ типов в QML: классы, генерируемые QObject, и некоторые встроенные типы значений, см. this documentation page. Поэтому использование QString в качестве типа Q_PROPERTY работает только потому, что у него есть встроенная поддержка в движке QML. Невозможно добавить поддержку для этих типов типов, таких как std::string (*).

Использование qRegisterMetaType также не помогает: Он просто регистрирует std::string как мета-типа, в частности означает, что он может храниться в QVariant. Это (в основном) не имеет отношения к интеграции QML.

Так что вернуть ваш добытчик QString:

Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged) 
    QString stldata() const { 
     return QString::fromStdString(myStlString); 
    } 

(*) На самом деле есть способ, чтобы добавить поддержку новых типов значений, но это частный API в QML, который должен работать непосредственно с основной Javascript engine. Модуль QtQuick использует этот частный API для добавления поддержки, например. тип значения QMatrix4x4.

+0

Вы правы, я сдался. Однако наличие «QString» копии уже имеющейся «std :: string» не является идеальным решением. Это означает, что больше памяти выгружается из уже ограниченного мобильного устройства, больше вычислений при обновлении строк и т. Д. – Avio

+0

Извините, вы не упоминали другую 'QString' копию' std :: string' как переменной-члена, я просто это себе представлял. Ну, я полагаю, что я могу просто преобразовать его каждый раз, когда интерфейс должен отображать переменную. – Avio