QML无法检测到C ++中销毁的QObject

时间:2014-06-28 11:27:09

标签: c++ qml qt5.2

所呈现的代码执行以下操作:

&LT 1为卤素;创建QObject派生类的对象并将其公开给QML

&LT 2 - ;该类有一个指向另一个QObject派生类的指针,并且QML可以通过Q_PROPERTY访问指针。

&LT 3的密度; QML中的MouseArea检测用户单击并简单地询问c ++代码以删除指针。

&LT 4是氢;检测到矩形后,矩形颜色变为黑色。

问题在于,虽然某些方法通过c ++检测到指针的删除,但其他方法并没有。

查看内联评论:

(1)和(1b)的组合起作用

(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}

1 个答案:

答案 0 :(得分:0)

您的财产声明对我来说很奇怪:name显然可以更改,但您已将其声明为CONSTANT。我的猜测是,如果没有CONSTANT它会更好地工作,而是在NOTIFY的值发生变化时提供nameChanged name信号。无法保证绑定到C ++属性的QML状态将被更新。