本周六晚七点半开讲
内容:C++ 与 QML 交互
地点上海Qt开发联盟 (QQ群号:279906625) 群视频。
如果您想围观的话,那么也可以进入全民TV直播(这里)来观摩。
以下为本次交流会大纲:
QML 与 C++ 的交互
有人说 QML 与 C++ 的交互太麻烦了,由于 QML 本身是面向对象的,所以交互起来依赖于 Qt 本身的元对象系统,显得十分笨重。但是仔细研究就会明白这样做的意义了。
QML 与 C++ 的数据交互
Qt TypeQML Basic Typeboolboolunsigned int, intintdoubledoublefloat, qrealrealQStringstringQUrlurlQColorcolorQFontfontQDatedateQPoint, QPointFpointQSize, QSizeFsizeQRect, QRectFrectQMatrix4x4matrix4x4QQuaternionquaternionQVector2D, QVector3D, QVector4Dvector2d, vector3d, vector4dQ_ENUMenumerationQVariant,QVariantMap,QVariantList,QJSValuevar,jsObject,jsArray,variantQJsonValue,QJsonObject, QJsonArrayvar, JSONObject带有 Q_GADGET 声明的类varQObject*idQQmlListPropertylist经测试,QVariant,QVariantMap,QVariantList 可以处理var类型的属性。
另外可以将 qml 对象的 id 传入,C++参数是 QObject*。
如果要将一个数组从 C++ 传给 QML,最好使用 QJsonArray,或者QList,QList,QList,QQmlListProperty。
注意,不同 QJSEngine 之间的 QJSValue 不同互相使用。
QML 调用 C++ 对象方法
全局单例
qmlRegisterSingleton
注册的单例有两类,一类 QObject*,一类 QJSValue。
QQmlContext::setContextProperty(QString, QObject*);
这个注册到上下文时要注意他的生命还未开始。
注册新类型到 QML
QObject
QQuickItem
QQuickPaintItem
QAbstractItemModel
推荐使用 QAbstractListModel,省时间。
如下诉代码:
int rowCount(const QModelIndex &parent) const;QVariant data(const QModelIndex &index, int role) const;QHash roleNames() const;enum Roles{NameRole = Qt::UserRole + 1,AgeRole};int rowCount(const QModelIndex &parent) const;QVariant data(const QModelIndex &index, int role) const;QHash roleNames() const;int TestModel::rowCount(const QModelIndex &parent) const{Q_UNUSED(parent)return m_datas.length();}QVariant TestModel::data(const QModelIndex &index, int role) const{if (!index.isValid() || index.row() < 0)return QVariant();if (index.row() >= m_datas.count()) {qWarning()