【问题标题】:Qml not receiving updated value of member variable of base classQml没有收到基类成员变量的更新值
【发布时间】:2026-02-15 13:10:01
【问题描述】:

我基本上只是想使用多个派生类来更改基类的成员变量并使用 qproperty 将该值转发给 qml,但由于某种原因它不起作用

汽车.h

    #include <QObject>

    class Car : public QObject{
        Q_OBJECT
        Q_PROPERTY(int seats MEMBER m_seats NOTIFY updateSeats)

    public:
        explicit Car(QObject *parent = 0);
        ~Car();
        int m_seats;
        Q_INVOKABLE void test();

    signals:
        void updateSeats();
    };

汽车.cpp

    #include "car.h"

    Car::Car(QObject *parent) :
        QObject(parent),
        m_seats(0)
    {

    }

    Car::test(){
        m_seats = 5;
        emit updateSeats();
    }

    Car::~Car(){}

丰田.h

    #include "car.h"

    class Toyota : public Car{
        Q_OBJECT


    public:
        explicit Toyota(QObject *parent = 0);
        ~Toyota();
        void foundCar();
    };

丰田.cpp

    #include "toyota.h"

    Toyota::Toyota(QObject *parent) 
    {

    }

    Toyota::foundCar(){
        m_seats = 4;
        emit updateSeats();
    }

    Toyota::~Toyota(){}

现在,在 Toyota 类中调用 foundCar 函数后,如果我这样做了 qml 中的 console.log(car.seats) 我得到 0,但我希望它是 4,因为我在派生类中修改它。 但是,如果我从 qml 调用 car.test() 然后打印 car.seats,则值为 5。我很困惑为什么会这样。在 qml 中,我希望 car.seats 为 4。我错过了什么?

【问题讨论】:

  • 你不是通过这个startGui函数来启动两个QmlEngine吗?能不能也展示一下main函数?
  • 我已经编辑了这个问题,基本上启动引擎是主要的,这部分没有问题,因为它适用于我拥有的所有其他类
  • 你如何将类/属性暴露给 QML ? main() 在你的代码中在哪里?
  • @Gebre 我认为您不应该两次问基本相同的问题。请关闭这个,因为另一个更“MRE”
  • 这些问题实际上是关于两个不同的事情。我通过使 m_seats 静态解决了这个问题。但是我不能对信号做同样的事情,qt 不允许。 @Amfasis 当我从派生类发出信号时,它没有更新,因为它是对象丰田,而不是汽车。

标签: c++ qt qml


【解决方案1】:

Toyota 对象是基类Car 的派生类对象Toyota 不是Car 的对象,您正在修改派生类对象成员Toyota::m_seats,这不会对直接基类Car 产生任何影响object .. 并且因为 Q_PROPERTY 仅在基类 Car 中定义 .. QML 会看到的唯一值是基类 object .. 特别是您在 setContextProperty 中设置的对象 ...您在帖子编辑后省略的代码.

根据您帖子中的先前编辑,您似乎将引擎中的setContextProperty 设置为Car 对象..它在此对象中您需要修改作为Q_PROPERTY 的成员。

我指的是你的代码:

Car::startGui(){
    QQmlApplicationEngine engine;
    QQmlContext *ctxt = engine.rootContext();
    ctxt->setContextProperty("car", this)
    // start engine, which works properly
}

【讨论】:

  • 感谢 Mohammad,我意识到这一点并将 m_seats 变量更改为静态。当我在 qml 中打印 gps.seats 时,它现在可以工作了。然而,信号 updateSeats() 在发出时似乎并没有更新 qml 变量。我该如何着手制作静态或其他解决方案?
  • 我的观察是你发出了裸信号..(它不携带更新的值)..我不能肯定这是问题所在,但可以肯定的是,你需要这篇文章:@987654321 @