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



  • 重置视频已经上线。



  • good video on bilibili



  • @qyvlik 谢谢



  • 支持楼主,楼主厉害


 

最近的回复

  • ![0_1540211558178_20181022_202905 (1).gif](正在上传 100%)

    阅读更多
  • 随后在git for windows这个软件中输入

    git clone git@git.coding.net:jiangcaiyang1/qtdreamrelease_windows.git

    就可以获得一个空的项目了。其它的项目也是同样的操作方法。然后呢,将此作为自动构建的代码库吧。
    此次介绍就是这样~😘 😘 🐧

    阅读更多
  • 0_1540027445466_很好.jpg
    萌梦安装包的分发始终是一个难题。要有一个稳定并且有效的方法进行分包,才能让大家都能够享受到萌梦动作编辑器的最新功能。我们目前有两种分发的方法:

    离线安装包。通常的位置是
    1.1 百度云盘
    1.2 QQ群文件
    1.3 github
    其中百度云盘和QQ群文件不会定期地更新,只有github的文件会定期更新。因为构建脚本要求每次有更改,都让github的文件更新。

    在线安装包。通常的位置是
    2.1 百度云盘
    2.2 QQ群文件
    2.3 github
    这里在线安装包的代码库主要还是在github中,在线安装包非常依赖CDN加速。目前github这块儿在国内做得不太好,还是希望在国内找一个类似的加速。目前可以选的只有两家:

    码云

    coding

    因为以前做过coding的加速,目前coding已经和腾讯云战略合作,所有的代码都要迁移到腾讯云了。而且对于代码库的空间要求变高了。128M。目前我的一个账号显然满足不了要求。所以有必要再注册一个账号。

    下面记录一下新建coding代码库的方法,并且尝试将萌梦安装包的线上代码库部分移动到coding代码库中。

    注册

    到这个位置注册。

    https://coding.net/register

    相信很快就会带你跳转到腾讯云中。不过这里我选择的是邮箱的方式,因为我希望注册尽量多的账号。

    设置ssh密钥

    进入控制台后,是这样的:
    0_1540028446495_2eeb7e93-c15b-4c82-9b36-58e1c304ea3f-image.png
    这个时候,我们要先创建项目,然后ssh的公钥。
    0_1540028822318_b3e81b93-099c-42d5-820d-deaf8d445913-image.png

    创建以后,开始部署公钥。在这里:
    0_1540028925337_d8059b64-8535-45e5-ba4c-d7454505aa5a-image.png
    这期间最好用OpenSSL生成SSH密钥。
    我使用的是git for windows来生成密钥的。方法是

    ssh-keygen

    如果你生成好了密钥,可以直接打开密钥内容看看:

    cat ~/.ssh/id_rsa.pub

    然后粘贴到网站的文本框中。

    添加好了之后,勾选“准许推送权限”,需要推送代码到代码库中。

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔