Установка свойства в QObject не работает для настраиваемого типа. Ты можешь сказать мне, почему? - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь использовать настраиваемый тип MoneyTst в качестве свойства в классе tst , который является qobject. Когда я вызываю метод setProperty (amount, 8000) в экземпляре tst , он не присваивает значение свойству. Можете ли вы объяснить, почему это свойство не устанавливает его значение?

// Пользовательский тип, который я пытаюсь установить с помощью QObject.setProperty ()

struct MoneyTst{

    MoneyTst(){}
    MoneyTst(int value){
        this->value = value;
    }

    int value;
    int getValue() const{
        return this->value;
    }

    void registerConverter(){
        QMetaType::registerConverter(&MoneyTst::getValue);
    }
};
Q_DECLARE_METATYPE(MoneyTst)

class tst : public QObject{
    Q_OBJECT
//Using MoneyTst over here as property
    Q_PROPERTY(MoneyTst amount READ getAmount WRITE setAmount)

public:
    MoneyTst getAmount() const{
        return this->amount;
    }

    void setAmount(MoneyTst value){
        this->amount = value;
    }
private:
    MoneyTst amount;
};



void runTest{
    tst o;
    o.setProperty("amount",8000);
    QVERIFY(o.property("amount").toInt() == 8000); //Fails because not value is not setting to 8000.

}

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Проблема в этих двух строках:

o.setProperty("amount",8000);
QVERIFY(o.property("amount").toInt() == 8000);

Сначала вы создаете QVariant из int, а ваша функция свойства, которая принимает MoneyTst, даже не вызывается. Затем вы пытаетесь преобразовать тип MoneyTst (хранящийся в QVariant) в int, но это не удается. Система свойств на основе QVariant требует явного преобразования типов для пользовательских типов.

Вы должны изменить свой код следующим образом:

o.setProperty("amount", QVariant::fromValue(MonetTst{8000}));
QVERIFY(o.property("amount").value<MoneyTst>().getValue() == 8000);
0 голосов
/ 04 августа 2020

Сделайте вашу структуру Q_GADGET, например:

struct MoneyTst{
    Q_GADGET
    
    MoneyTst(){}
    ...
};
Q_DECLARE_METATYPE(MoneyTst)
...