【问题标题】:Access member variable of C++ object in QML在 QML 中访问 C++ 对象的成员变量
【发布时间】:2015-09-29 15:15:03
【问题描述】:

有没有办法在 QML 中访问 C++ 对象的成员变量?在main.cpp 中,我向 QML 公开了一个对象。如何在 QML 中访问 controller.x

Controller ctrl;
QQuickView view;
QQmlContext* ctx = view.rootContext();
ctx->setContextProperty("controller", &ctrl);

在控制器中:

public:
 int x;

【问题讨论】:

    标签: c++ qt object qml


    【解决方案1】:

    将 C++ 成员声明为 property

    class Controller : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(int x MEMBER x NOTIFY xChanged)
    
        // ...
    
    signals:
        void xChanged();
    
    private:
        int x;
    };
    

    您还需要声明一个信号,这就是NOTIFY 功能所指的内容。这将让 QML 知道属性的值何时发生变化:

    如果未指定 READ 访问器函数,则需要 MEMBER 变量关联。这使得给定的成员变量可读可写,而无需创建 READ 和 WRITE 访问器函数。如果您需要控制变量访问,除了 MEMBER 变量关联(但不能同时使用两者)之外,仍然可以使用 READ 或 WRITE 访问器函数。

    然后像这样在 QML 中访问它:

    controller.x
    

    【讨论】:

      【解决方案2】:

      如果你不想使用属性绑定,你可以这样做。

      class Controller : public QObject
      {
        Q_ObJECT
      
        public:
          Q_INVOKABLE int getX() const { return x; }
      
        private:
          int x;
      }
      

      在你的 QML 中

      controller.getX()
      

      【讨论】:

      • 好的,谢谢您的回复,这很有帮助,但是在我的控制器中,我有 std::unordered_map,ValueReceiver 是一个类,我有 QtcpSocket 并且我有插槽启动() 将套接字与服务器连接。我不知道如何从这张地图将信号从 QML 连接到 ValueReceiver。
      • 您可以采用相同的方法。可能是另一个很少代码的问题会有帮助。
      • 在我的课上:Q_INVOKABLE QHash getQHash() const { return valuesReceivers;在 qml 我得到:错误:未知方法返回类型:QHash
      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多