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



  • 本周六晚七点半开讲

    内容:C++ 与 QML 交互

    地点上海Qt开发联盟 279906625 群视频。

    暂无其他直播平台。

    以下为本次交流会大纲:

    QML 与 C++ 的交互

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

    QML 与 C++ 的数据交互

    Qt Type QML Basic Type
    bool bool
    unsigned int, int int
    double double
    float, qreal real
    QString string
    QUrl url
    QColor color
    QFont font
    QDate date
    QPoint, QPointF point
    QSize, QSizeF size
    QRect, QRectF rect
    QMatrix4x4 matrix4x4
    QQuaternion quaternion
    QVector2D, QVector3D, QVector4D vector2d, vector3d, vector4d
    Q_ENUM enumeration
    QVariant,QVariantMap,QVariantList,QJSValue var,jsObject,jsArray,variant
    QJsonValue,QJsonObject, QJsonArray var, JSONObject
    带有 Q_GADGET 声明的类 var
    QObject* id
    QQmlListProperty<T> list<T>

    经测试,QVariantQVariantMapQVariantList 可以处理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 中的文件读写和网络


  • 网站研运

    强烈支持,并且我会在其他的地方转发的,让其它人知晓。


  • 网站研运

    我们开始转播了哦。
    为那些不是群里的朋友们转播了!
    地址是(全民TV):http://quanmin.tv/v/qtdream
    (斗鱼):http://www.douyutv.com/492592



  • 重置视频已经上线。http://www.bilibili.com/video/av4085094/



  • good video on bilibili



  • @qyvlik 谢谢



  • 支持楼主,楼主厉害


Log in to reply
 

走马观花

最近的回复

  • C

    这是一个传文件特别厉害的网站,速度不限制,操作特别简单,网站界面也很干净,没有花里胡哨的广告。特别特别的好!
    https://www.wenshushu.cn/
    给大家看两张图(发不了高清图):
    QQ截图20200415172503.jpg QQ截图20200415172453.jpg

    用文叔叔,还可以向网友索取你想要的资源,发链接给对方,他会上传资源给你,比用百度网盘作为中转站要快!!

    read more
  • 0_1539655233041_329385492.jpg
    各位大家好哦。
    经过一个晚上对论坛的维护更新,我们成功地将论坛更新到最新的版本。这次的版本更新主要是提升了稳定性,因此功能上和原来的一样,请大家放心,不会出现奇怪的东西什么的啦。然后呢,由于提升了稳定性,因此论坛不会莫名其妙地出现未响应的情况,总之比以前好就对啦。

    此外,论坛新增了自己研制的一个分享的插件:nodebb-plugin-share-sns-cn。这个插件呢,主要是做主流社交网站的分享的。目前暂时支持QQ、微博以及微信的分享。目前初版是1.0。

    希望大家常常来论坛玩~

    read more
  • @lyt 是的哦,这个也是论坛插件做出来的。为此我做了一个这样的插件:

    Basic CMS plugin for NodeBB - qtdream homepage

    我们还有自己做的动作编辑器软件

    QtDreamMotionEditor

    欢迎来访问哦。

    read more
  • L

    哇这个也是个插件嘛?

    read more

关注我们

微博
QQ群