使用接口类型查找子窗口小部件

Finding child widgets using interface type

本文关键字:窗口 小部 查找 接口类型      更新时间:2023-10-16

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}'

我该如何解决这个问题?

如注释中所述,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();
    }
}