本周六晚七点半开讲内容: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*);这个注册到上下文时要注意他的生命还未开始。注册新类型到 QMLQObjectQQuickItemQQuickPaintItemQAbstractItemModel推荐使用 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具体两个实例。QmlThreadqml 中的多线程。QmlNetworkqml 中的文件读写和网络