所呈现的代码执行以下操作:
&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}
答案 0 :(得分:0)
您的财产声明对我来说很奇怪:name
显然可以更改,但您已将其声明为CONSTANT
。我的猜测是,如果没有CONSTANT
它会更好地工作,而是在NOTIFY
的值发生变化时提供nameChanged
name
信号。无法保证绑定到C ++属性的QML状态将被更新。