Ale*_*ich 4 c++ qt qobject qmetaobject
如果我们知道它的类型和名称(如果指定),则可以找到一个孩子,如下所示:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
Run Code Online (Sandbox Code Playgroud)
但是,每个函数QObject都有metaObject()返回的函数属性 QMetaObject*。依次QMetaObject具有功能className()。是否可以QObject通过这样的类名轻松找到:
QWidget *widget = (QWidget*)parentWidget->findByClassName("QPushButton", "button1");
Run Code Online (Sandbox Code Playgroud)
或者是让所有QWidget孩子过的唯一方法
QList<QWidget *> widgets = parentWidget->findChildren<QWidget *>("widgetname");
Run Code Online (Sandbox Code Playgroud)
然后std::find_if用metaObject()->className()?过滤列表?
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;
}
Run Code Online (Sandbox Code Playgroud)
然后findByClassName(parentWidget, "QPushButton"),很简单,很明显,如果您希望将指针作为具体类型,则可以对此进行扩展,objectName并进行一些操作qobject_cast...如果这样做,则findChild()无论如何您都应该使用现有功能...指定仅当您不事先知道类型时才将类型作为字符串有意义,并且说...在运行时确定。