• 8488阅读
  • 8回复

[公告][Qt Dream]Qt 在线技术交流之C++ 与 QML 交互 [复制链接]

上一主题 下一主题
离线彩阳
 

只看楼主 倒序阅读 楼主  发表于: 2016-03-11


本周六晚七点半开讲

内容: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 中的文件读写和网络
上海Qt开发联盟,热忱地欢迎你的加入!
离线toby520

只看该作者 1楼 发表于: 2016-03-11
        
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线彩阳

只看该作者 2楼 发表于: 2016-03-11
回 toby520 的帖子
toby520:[表情]  [表情]  [表情]  [表情]  [表情]  (2016-03-11 17:13) 

谢谢支持,欢迎围观。
上海Qt开发联盟,热忱地欢迎你的加入!
离线weinkym

只看该作者 3楼 发表于: 2016-03-13
离线qyvlik

只看该作者 4楼 发表于: 2016-03-13
高清重置版已经上线 http://www.bilibili.com/video/av4085094/
ubiboot
离线彩阳

只看该作者 5楼 发表于: 2016-03-13
不错,支持一个!!对了C++和QML结合还有很多例子,尽在Qt帮助文档。
上海Qt开发联盟,热忱地欢迎你的加入!
离线slf0205

只看该作者 6楼 发表于: 2016-03-13
楼主:

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

只看该作者 7楼 发表于: 2016-03-17
  学习学习
离线yuki520

只看该作者 8楼 发表于: 2022-06-29
不错,支持一个!!对了C++和QML结合还有很多例子,尽在Qt帮助文档。  168won极速赛车
快速回复
限100 字节
 
上一个 下一个