QML не может обнаружить уничтоженный QObject в переполнении стека

Представленный код выполняет следующие действия:

<1> Создать объект из производного класса QObject и выставить его в QML

<2> У класса есть указатель на другой производный класс QObject, и указатель доступен для QML через Q_PROPERTY.

<3> MouseArea в QML обнаруживает щелчок пользователя и просто запрашивает код c ++ для удаления указателя.

<4> Цвет прямоугольника становится черным, как только это обнаружено.

Проблема в том, что в то время как некоторые подходы обнаруживают удаление указателя с ++, другие подходы не обнаруживают.

Посмотрите на встроенные комментарии:

Сочетание (1) и (1б) работ

Сочетание (1) и (1d) не работает

(2) один сам по себе работает, но (3) один сам по себе не работает.

Когда все сработает, вы должны увидеть, как цвет прямоугольника меняется с черного на желтый.

Может кто-нибудь объяснить, пожалуйста, это поведение?

Коды CPP:

class Name : public QObject
{
Q_OBJECT
Q_PROPERTY(bool boolVal READ boolVal CONSTANT FINAL)
public:
bool boolVal() const {return true;}
};

class Root : public QObject
{
Q_OBJECT
Q_PROPERTY(QObject* name READ name CONSTANT FINAL)
public:
QObject* name() const {return m_pName;}
Q_INVOKABLE void deleteName() {delete m_pName; m_pName = 0;}
private:
Name *m_pName {new Name};
};

//--- main
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

Root objRoot;
QtQuick2ApplicationViewer viewer0;
viewer0.rootContext()->setContextProperty("objRoot", &objRoot);
viewer0.setMainQmlFile(QStringLiteral("qml/dualWindowApp/main.qml"));
viewer0.showExpanded();

return app.exec();
}

Код QML:

import QtQuick 2.0

Rectangle {
width: 360
height: 360

color: "red"
Rectangle {
id: objRect
anchors {left: parent.left; top: parent.top}
height: 70; width: 70;

property bool checked
property QtObject temp: objRoot.name

color: checked ? "yellow" : "black"                                 //                        (1)

//color: objRect.temp && objRect.temp.boolVal ? "yellow" : "black"  //--->WORKS               (2)
//color: objRoot.name && objRoot.name.boolVal ? "yellow" : "black"  //--->DOES NOT WORK !!!   (3)

Binding on checked {
//value: objRect.temp && objRect.temp.boolVal                    //--->DOES NOT WORK !!!   (1a)
//value: objRect.temp !== null && objRect.temp.boolVal           //--->WORKS               (1b)
value: objRect.temp ? objRect.temp.boolVal : false               //--->WORKS               (1c)

//Using directly without collecting in local QtQobject temp:
//----------------------------------------------------------
//value: objRoot.name && objRoot.name.boolVal                    //--->DOES NOT WORK !!!   (1d)
//value: objRoot.name !== null && objRoot.name.boolVal           //--->DOES NOT WORK !!!   (1e)
//value: objRoot.name ? objRoot.name.boolVal : false             //--->DOES NOT WORK !!!   (1f)
}

Text {
text: "Destroy"anchors.centerIn: parent
}

MouseArea {
anchors.fill: parent
onClicked: objRoot.deleteName()
}
}
}

с помощью: {Qt/QML 5.2.0, Win 7, MinGW 4.8, QtQuick 2.0}

0

Решение

Ваша декларация собственности выглядит странно для меня: name может измениться, но вы объявили это CONSTANT, Я думаю, что это будет работать намного лучше без CONSTANTи вместо этого предоставить NOTIFY из nameChanged сигнал испускается при значении name изменения, иначе нет гарантии, что состояния QML, связанные со свойствами C ++, будут обновлены.

0

Другие решения


По вопросам рекламы [email protected]