gpt4 book ai didi

c++ - 在 Qt/QML 中访问/修改一个类型的所有实例

转载 作者:太空狗 更新时间:2023-10-29 21:18:55 24 4
gpt4 key购买 nike

在 QML 中,我有一个自定义对象类型(一个单独的 QML 文件),我想要一种访问和/或修改这种类型的每个实例的方法。举一个非常简单的例子:

MyText.qml:

Text {
height: 100
width: 100
color: "red"

function logStuff() {
console.log("This is MyText")
}
}

一些页面.qml:

MyText {
id: text1
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
text: "foo"
}

MyText {
id: text2
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: "bar"
}

当事件发生时(例如,单击 SomePage.qml 上的按钮或发出信号),我希望能够将 MyText 的所有实例更改为一个属性具有相同的值,或者调用每个 MyText 的 logStuff() 函数。

注意:在我的实际用例中,实际上有几十个这样的实例,并且还会有其他不是 MyText 实例的 Text 元素。

我对 jQuery 有一点经验,希望有类似于 jQuery 选择器的东西,但我一直无法找到任何类似的东西。 QML 或 C++(或混合)解决方案都可以。

最佳答案

我想推荐一种使用 C++ 的方法。由于无法获取 QML 对象的基类,您可以基于 objectName 属性进行搜索,这在 C++ 中是可访问的。

假设我们有基础 QML 对象:

import QtQuick 2.3

Item {
id: base
objectName: "BaseItem"
property int someValue: 0
onSomeValueChanged: {
console.log("'someValue' was changed to " + someValue + " for " + base);
}
}

还有另一个 QML 文件,其中使用了这些对象:

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
visible: true
width: 300
height: 300
id: mainWindow

Base {
id: derived1
}
Base {
id: derived2
}
Base {
id: derived3
}
}

想法是所有派生对象都从基类继承相同的objectName

所以现在您可以简单地找到 C++ 中的所有对象:

QObject *root = engine.rootObjects().first();
QList<QObject *> list = root->findChildren<QObject *>("BaseItem");
qsrand(QTime::currentTime().msec());
foreach(QObject *item,list) {
item->setProperty("someValue",qrand());
}

这里我只是改变了属性,但你也可以用 QMetaObject::invokeMethod() 等调用一些方法

关于c++ - 在 Qt/QML 中访问/修改一个类型的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767430/

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