gpt4 book ai didi

c++ - 有没有办法通过类名找到 QObject child ?

转载 作者:太空狗 更新时间:2023-10-29 20:01:56 25 4
gpt4 key购买 nike

如果我们知道它的类型和名称(如果指定),就可以找到一个 child ,如下所示:

QPushButton *button = parentWidget->findChild<QPushButton *>("button1");

然而,每个QObject 都有返回QMetaObject*metaObject() 函数属性。反过来,QMetaObject 具有函数 className()。是否可以像这样通过类名轻松找到 QObject:

QWidget *widget = (QWidget*)parentWidget->findByClassName("QPushButton", "button1");

或者获取所有 QWidget child 的唯一方法

QList<QWidget *> widgets = parentWidget->findChildren<QWidget *>("widgetname");

然后通过 metaObject()->className()std::find_if 过滤列表?

最佳答案

findChild() 已经允许您指定要搜索的内容的类型。

第二个参数实际上是objectName字符串属性。

如果您询问是否可以将类类型指定为字符串,似乎没有这样的选项。

您可以轻松实现这样的功能,只需迭代对象树并查询每个对象的元对象以获取类名并与您的字符串进行比较。

QObject * findByClassName(const QObject * const o, const char *name) {
QObject * res = nullptr;
foreach (QObject * c, o->children()) {
if (res) break;
if (QLatin1String(c->metaObject()->className()) == name) res = c;
else res = findByClassName(c, name);
}
return res;
}

然后简单地 findByClassName(parentWidget, "QPushButton"),显然,您可以对此进行扩展以包含 objectName 并执行一些 qobject_cast如果您想将指针作为具体类型获取...如果您这样做了,您应该简单地使用现有的 findChild() 函数...仅将类型指定为字符串当您事先不知道类型时才有意义,而且据说...在运行时确定。

关于c++ - 有没有办法通过类名找到 QObject child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49215660/

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