Qt允许您通过选择特定的类名来获取子窗口小部件列表:
QList<MyWidget*> list = form.findChildren<MyWidget*>();
foreach(MyWidget *w, list) {
qDebug()<<"Widget name: "<<w->objectName();
}
我创建了一个简单的界面,它应该在不同类型的小部件中提供相同的功能:
class ParametrizedWidget
{
public:
virtual ~ParametrizedWidget() {}
virtual void loadProperties() = 0;
};
然后我添加了MyWidget
声明的接口:
class MyWidget : public QWidget, public ParametrizedWidget
{
Q_OBJECT
public:
void loadProperties() override;
...
}
但是使用小部件列表的代码对我的界面不起作用:
// All parametrized widgets in form
QList<ParametrizedWidget*> list = form.findChildren<ParametrizedWidget*>();
foreach(ParametrizedWidget *w, list) {
w->loadProperties();
}
这会引发错误 - ParametrizedWidget
似乎与该代码不兼容:
error: 'staticMetaObject' is not a member of 'ObjType {aka ParametrizedWidget}'
如何解决这个问题?
答案 0 :(得分:0)
如评论中所述,QObject::findChildren<T>
的模板参数必须是QObject
的子类。
这意味着必须使用dynamic_cast
从findChildren
结果中过滤所需的子类:
QList<QWidget*> list = form.findChildren<QWidget*>();
foreach(QWidget *w, list) {
if(ParametrizedWidget* parametrized = dynamic_cast<ParametrizedWidget*>(w)) {
parametrized->loadProperties();
}
}