我有一个QML对象,可以在其中创建相同的对象。函数addChildRect是从C ++调用的。每个对象都具有唯一的id
和objectName
(对于每个对象,它们都是相同的)。我希望使用QObject::findChild
,从C ++访问它们,但对于动态创建的对象,此函数始终返回空指针。我的建议是,这个函数只解析最初在QML中的对象。如何从C ++访问动态创建的对象?
Rect.qml
Rectangle {
color: "red"
function addChildRect(id,x,y,width,height)
{
var component;
component = Qt.createComponent("Rect.qml");
component.createObject(this, {
id:id,
objectName:id,
x:x,
y:y,
width:width,
height:height});
}
}
C ++代码:
//find element
auto parentRectView = engine.rootObjects().first()->findChild<QObject*>(QString::number(id()));
//create element
QMetaObject::invokeMethod(parentRectView,"addChildRect",
Q_ARG(QVariant,id()),
Q_ARG(QVariant,m_position.x()),
Q_ARG(QVariant,m_position.y()),
Q_ARG(QVariant,m_size.height()),
Q_ARG(QVariant,m_size.width()));
答案 0 :(得分:2)
假设我们有以下QML代码(main.qml):
Window {
width: 300
height: 400
visible: true
id: window
Component {
id: testItem
Rectangle {
width: 100
height: 100
color: "green"
anchors.centerIn: parent
}
}
function addItem(name)
{
var component = testItem.createObject(window.contentItem, {objectName: name});
return component;
}
}
注意 - 作为父母我传递Item
,在我的情况下,这是Window.contentItem
- 隐藏的根项Window
,因为Window不是Item
。
我不是javascript大师,但我认为你在这里使用this
是指向函数的指针,而不是Item
。
好的,这是一个C ++代码:
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *item = dynamic_cast<QObject *>(engine.rootObjects().at(0));
QVariant retVal;
QMetaObject::invokeMethod(item, "addItem", Qt::DirectConnection,
Q_RETURN_ARG(QVariant, retVal),
Q_ARG(QVariant, "test"));
qWarning() << retVal;
在我的情况下,输出将类似于
QVariant(QObject *,QQuickRectangle(0x2c125490,name =“test”))
您只需将QVariant
投射到QQuickItem
或QObject
。
至于找到动态创建的对象,你是对的。例如,以下代码的输出:
QObject *rect = qvariant_cast<QObject*>(retVal);
qWarning() << rect;
QObject *myitem = item->findChild<QObject *>("test");
qWarning() << myitem;
将是:
QQuickRectangle(0x2c270d38, name = "test")
QObject(0x0)
findChild
虽然设置了parent
rect
,但仍返回null。
也许有人可以解释这种奇怪的行为。