gpt4 book ai didi

c++ - 从 C++ 访问动态创建的 QML 对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:49 25 4
gpt4 key购买 nike

我有一个 QML 对象,它可以在其中创建相同的对象。从 C++ 调用函数 addChildRect。每个对象都有其唯一的 idobjectName(对于每个对象,它们都是相同的)。我想使用 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()));

最佳答案

假设我们有以下 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 的隐藏根项,因为窗口不是 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 转换为QQuickItemQObject

至于找到动态创建的对象,你是对的。例如以下代码的输出:

QObject *rect = qvariant_cast<QObject*>(retVal);
qWarning() << rect;
QObject *myitem = item->findChild<QObject *>("test");
qWarning() << myitem;

将是:

QQuickRectangle(0x2c270d38, name = "test") 
QObject(0x0)

findChild 返回 null,尽管设置了 rectparent。也许有人可以解释这种奇怪的行为。

关于c++ - 从 C++ 访问动态创建的 QML 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42270905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com