查看完整版本: [-- [Qt Dream]Qt 在线技术交流之C++ 与 QML 交互 --]

QTCN开发网 -> 网站公告 -> [Qt Dream]Qt 在线技术交流之C++ 与 QML 交互 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

彩阳 2016-03-11 15:36

[Qt Dream]Qt 在线技术交流之C++ 与 QML 交互



本周六晚七点半开讲

内容:C++ 与 QML 交互
地点上海Qt开发联盟 (QQ群号:279906625) 群视频。
如果您想围观的话,那么也可以进入全民TV直播(这里)来观摩。
以下为本次交流会大纲:


QML 与 C++ 的交互

有人说 QML 与 C++ 的交互太麻烦了,由于 QML 本身是面向对象的,所以交互起来依赖于 Qt 本身的元对象系统,显得十分笨重。但是仔细研究就会明白这样做的意义了。


QML 与 C++ 的数据交互

Qt TypeQML Basic Type
boolbool
unsigned int, intint
doubledouble
float, qrealreal
QStringstring
QUrlurl
QColorcolor
QFontfont
QDatedate
QPoint, QPointFpoint
QSize, QSizeFsize
QRect, QRectFrect
QMatrix4x4matrix4x4
QQuaternionquaternion
QVector2D, QVector3D, QVector4Dvector2d, vector3d, vector4d
Q_ENUMenumeration
QVariant,QVariantMap,QVariantList,QJSValuevar,jsObject,jsArray,variant
QJsonValue,QJsonObject, QJsonArrayvar, JSONObject
带有 Q_GADGET 声明的类var
QObject*id
QQmlListPropertylist
经测试,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 中的文件读写和网络

toby520 2016-03-11 17:13
        

彩阳 2016-03-11 17:28
toby520:[表情]  [表情]  [表情]  [表情]  [表情]  (2016-03-11 17:13) 

谢谢支持,欢迎围观。

weinkym 2016-03-13 09:06

qyvlik 2016-03-13 13:37
高清重置版已经上线 http://www.bilibili.com/video/av4085094/

彩阳 2016-03-13 14:41
不错,支持一个!!对了C++和QML结合还有很多例子,尽在Qt帮助文档。

slf0205 2016-03-13 21:02
楼主:

    qml 怎么用 c++申明的枚举类型?

wanmig0354 2016-03-17 14:34
  学习学习


查看完整版本: [-- [Qt Dream]Qt 在线技术交流之C++ 与 QML 交互 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled