彩阳 |
2016-03-11 15:36 |
[Qt Dream]Qt 在线技术交流之C++ 与 QML 交互
本周六晚七点半开讲
内容:C++ 与 QML 交互 地点上海Qt开发联盟 (QQ群号:279906625) 群视频。 如果您想围观的话,那么也可以进入全民TV直播(这里)来观摩。 以下为本次交流会大纲:
QML 与 C++ 的交互
有人说 QML 与 C++ 的交互太麻烦了,由于 QML 本身是面向对象的,所以交互起来依赖于 Qt 本身的元对象系统,显得十分笨重。但是仔细研究就会明白这样做的意义了。
QML 与 C++ 的数据交互
经测试,QVariant,QVariantMap,QVariantList 可以处理var类型的属性。 另外可以将 qml 对象的 id 传入,C++参数是 QObject*。
如果要将一个数组从 C++ 传给 QML,最好使用 QJsonArray,或者QList<QString>,QList<QVariant>,QList<QJSValue>,QQmlListProperty<T>。
注意,不同 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<int, QByteArray> roleNames() const; enum Roles{NameRole = Qt::UserRole + 1,AgeRole};int rowCount(const QModelIndex &parent) const;QVariant data(const QModelIndex &index, int role) const;QHash<int, QByteArray> 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() << "SatelliteModel: Index out of bound";return QVariant();}const Dao &dao = m_datas.at(index.row());switch (role){case NameRole:return dao.name();case AgeRole:return dao.age();default:break;}return QVariant();}QHash<int, QByteArray> TestModel::roleNames() const{QHash<int, QByteArray> roleNames;roleNames.insert(NameRole, "NameRole");roleNames.insert(AgeRole, "AgeRole");return roleNames;}
Q_GADGET
使用 Q_GADGET 可以支持注册枚举,属性,Q_INVOKABLE。但是不支持信号和槽。
C++ 调用 QML 对象方法
将 qml 对象的 id 以 QObject* 的方式进行传参
在 C++ 代码中主动捕获 qml 对象
属性系统
invokeMethod
具体两个实例。
QmlThread
qml 中的多线程。
QmlNetwork
qml 中的文件读写和网络
|
|