如何在创建对象时从 QML 调用任意 C++ 函数?

Posted

技术标签:

【中文标题】如何在创建对象时从 QML 调用任意 C++ 函数?【英文标题】:How to call arbitrary C++ functions from QML right at the object's creation? 【发布时间】:2019-02-18 03:59:29 【问题描述】:

这是我的 main.qml:

import QtQuick 2.0
import A 1.0

Item 

    width: 1280
    height: 720

    OpenGlVideoQtQuick 

    

这是 OpenGLVideoQtQuick 的一部分:

class OpenGlVideoQtQuick : public QQuickItem

    Q_OBJECT
    Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged)

public:
    OpenGlVideoQtQuick();

    qreal t() const  return m_t; 
    void setT(qreal t);
    Q_INVOKABLE void initRtspMedia(const QString &uri);

如何在创建OpenGlVideoQtQuick QML 对象时从QML 调用initRtspMedia()?我只看到按钮和其他东西如何调用 C++ 代码,但没有看到如何立即调用它。

【问题讨论】:

【参考方案1】:

对于这种情况,您可以使用Component.onCompleted:

import QtQuick 2.0
import A 1.0

Item 

    width: 1280
    height: 720

    OpenGlVideoQtQuick 
        id: opengl_video
        Component.onCompleted: opengl_video.initRtspMedia("some uri")
    


或者从 C++ 你可以在QQmlParserStatus 的帮助下做到这一点:

class OpenGlVideoQtQuick : public QQuickItem, public QQmlParserStatus

    Q_OBJECT
    Q_PROPERTY(qreal t READ t WRITE setT NOTIFY tChanged)
    Q_INTERFACES(QQmlParserStatus)
public:
    OpenGlVideoQtQuick();

    qreal t() const  return m_t; 
    void setT(qreal t);
    Q_INVOKABLE void initRtspMedia(const QString &uri);

   void classBegin() 
   void componentComplete() 
       initRtspMedia("some uri");
   

【讨论】:

以上是关于如何在创建对象时从 QML 调用任意 C++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取 QML 方法的源代码?

QML 从入门到放弃 第二卷

在现有 C++ QT 项目中实例化 QML 对象

如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

如何在 C++ 代码中的一些“繁重”操作之前使 QML 对象可见

如何有效地将单个对象的多个 C++ 数据成员公开给 QML?