我有一个STL代码库需要在QtQuick 2.0应用程序(图形界面)和纯粹的STL应用程序(服务器)之间共享。接口可以从共享的STL代码库派生它的类,因此它可以有Q_PROPERTY
个,信号,插槽等,但共享数据结构需要保持仅STL。
我想避免数据重复(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
s。
用以下内容编写文本字段:
Text
{
text: myserviceinterface.stldata
}
发出警告Unable to assign std::string to QString
,同时追加现有的QML字符串:
Text
{
text: "text: " + myserviceinterface.stldata
}
使Text
控件显示为奇怪的QVariant(std::string)
。
我做错了什么?
答案 0 :(得分:5)
我担心您无法在QML中直接使用std::string
,您必须先转换为QString
。
通常,您只能将两种C ++类型导出到QML:QObject派生类和一些内置值类型,请参阅this documentation page。因此,仅使用QString
作为Q_PROPERTY的类型才有效,因为它在QML引擎中具有特殊的内置支持。无法为std::string
(*)等更多值类型添加支持。
使用qRegisterMetaType
也无济于事:它只是将std::string
注册为元类型,其中包括它可以存储在QVariant
中。它(大多数)与QML集成无关。
所以你的getter返回QString
:
Q_PROPERTY(QString stldata READ stldata WRITE setSTLData NOTIFY stldataChanged)
QString stldata() const {
return QString::fromStdString(myStlString);
}
(*)实际上有一种方法可以添加对新值类型的支持,但这是QML中的私有API,需要直接使用底层Javascript引擎。 QtQuick模块使用该私有API来添加对例如的支持。 QMatrix4x4
值类型。