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

时间:2015-12-03 10:18:09

标签: c++ qt inheritance

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

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如评论中所述,QObject::findChildren<T>的模板参数必须是QObject的子类。

这意味着必须使用dynamic_castfindChildren结果中过滤所需的子类:

QList<QWidget*> list = form.findChildren<QWidget*>();

foreach(QWidget *w, list) {
    if(ParametrizedWidget* parametrized = dynamic_cast<ParametrizedWidget*>(w)) {
        parametrized->loadProperties();
    }
}