等价于 QObject::findChild 函数的 qml-child-items
Posted
技术标签:
【中文标题】等价于 QObject::findChild 函数的 qml-child-items【英文标题】:Equivalent among qml-child-items of the QObject::findChild function 【发布时间】:2018-07-31 12:13:29 【问题描述】:T QObject::findChild
允许您按类和名称在子项中搜索特定对象:
QPushButton *button = parentWidget->findChild<QPushButton*>("button1",
Qt::FindDirectChildrenOnly);
我需要按类和名称找到这样的子项。类似的东西
MyQQuickItem *item = parentItem->findChildItem<MyQQuickItem*>("item1");
但QQuickItem
不存在该函数。
实现此目的最方便/有效的方法是什么?
到目前为止,我只能想到QQuickItem::childItems
列表上的一个循环。
【问题讨论】:
QQuickItem 是一个 QObject,所以你可以使用 findChildren 方法 这将在 QObject 经典父级中搜索,我需要通过 parentItem 父级进行搜索。 【参考方案1】:类似的逻辑应该实现如下所示:
void FindChildren_helper(const QQuickItem *parent, const QString &name, const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options)
if (!parent || !list)
return;
const QList<QQuickItem *> &children = parent->childItems();
QQuickItem *obj;
for (int i = 0; i < children.size(); ++i)
obj = children.at(i);
if(mo.cast(obj))
if (name.isNull() || obj->objectName() == name)
list->append(obj);
if (options & Qt::FindChildrenRecursively)
FindChildren_helper(obj, name, mo, list, options);
void FindChildren_helper(const QQuickItem *parent, const QRegularExpression &re, const QMetaObject &mo, QList<void*> *list, Qt::FindChildOptions options)
if (!parent || !list)
return;
const QList<QQuickItem *> &children = parent->childItems();
QQuickItem *obj;
for (int i = 0; i < children.size(); ++i)
obj = children.at(i);
if(mo.cast(obj))
QRegularExpressionMatch m = re.match(obj->objectName());
if (m.hasMatch())
list->append(obj);
if (options & Qt::FindChildrenRecursively)
FindChildren_helper(obj, re, mo, list, options);
template<typename T> QList<T> findChildren(QQuickItem *parent, const QString &aName = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively)
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
QList<T> list;
FindChildren_helper(parent, aName, ObjType::staticMetaObject, reinterpret_cast<QList<void *> *>(&list), options);
return list;
template<typename T> QList<T> findChildren(QQuickItem *parent, const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively)
typedef typename std::remove_cv<typename std::remove_pointer<T>::type>::type ObjType;
QList<T> list;
FindChildren_helper(parent, re, ObjType::staticMetaObject, reinterpret_cast<QList<void *> *>(&list), options);
return list;
例子:
QList<QQuickItem *> childs = findChildren<QQuickItem *>(parentItem, "somename", Qt::FindDirectChildrenOnly);
【讨论】:
以上是关于等价于 QObject::findChild 函数的 qml-child-items的主要内容,如果未能解决你的问题,请参考以下文章
QObject::findChild 为添加到状态栏的 QLabel 返回 0