【问题标题】:Qt emit base class signal from derived classQt 从派生类发出基类信号
【发布时间】:2019-10-02 18:21:13
【问题描述】:

我基本上只是想使用多个派生类来更改基类的成员变量并使用 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();
        static int m_seats;

    signals:
        void updateSeats();
    };

汽车.cpp

    #include "car.h"

    Car::Car(QObject *parent) :
        QObject(parent)
    {

    }

    int Car::m_seats = 0;

    Car::~Car(){}

丰田.h

    #include "car.h"

    class Toyota : public Car{
        Q_OBJECT


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

丰田.cpp

    #include "toyota.h"

    Toyota::Toyota(QObject *parent) 
    {

    }

    Toyota::foundCar(){
        m_seats = 4;
        emit updateSeats();  // This isn't working
    }

    Toyota::~Toyota(){}

main.cpp

    #include <QGuiApplication>
    #include "car.h"
    #include "toyota.h"

    int main(int argc, char *argv[])
    {

        QGuiApplication app(argc, argv);
        Car car = new Car();
        Toyota ty = new Toyota();
        QQmlApplicationEngine engine;
        QQmlContext *ctxt = engine.rootContext();
        ctxt->setContextProperty("car", car);
        ctxt->setContextProperty("toyota", ty);
        engine.load(QUrl(QLatin1String("qrc:/main.qml")));

        app.exec();
        engine.quit();
    }

在调用 foundCar 函数后打印 car.seats 时在 qml 中

main.qml

    toyota.foundCar()
    console.log(car.seats)

输出仍然是 0。发出的信号没有更新的原因可能是因为它来自不同的对象(丰田)。那么如何从派生类发出基类的信号呢?

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    您的 toyotacar 属性是两个独立的属性。

    您必须从toyota 读取seats 属性:

    main.qml

    toyota.foundCar()
    console.log(toyota.seats) //<--- here
    

    评论后更新:

    好的,这是一种不同的方法,但在这种情况下,我会将 car 属性设置为 toyota 指针:

    main.cpp

        Car car = new Toyota();
    
        ctxt->setContextProperty("car", ty);
        ctxt->setContextProperty("toyota", ty);
    

    这可能可以安装在一个总体类中(例如 car_managercar_store),其中您有一个可用汽车列表和一个选择一辆车作为当前汽车的功能,然后您更新通用 @987654330 @ 或 current 该总体类的属性。

    我这样说是因为当你想从根上下文工作时你会得到讨厌的代码,此外,根属性并不表示它们已更改

    【讨论】:

    • 是的,但我想通过 car.seats 访问它。基本上想象一下,如果我也有更多的类,即本田和马自达,也衍生自汽车。在代码运行时,只有一种车型处于活动状态。因此,无论哪种汽车类型处于活动状态,我都希望获得座位的价值。所以我希望能够做到:console.log(car.seats)
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多