【问题标题】:Finding child widgets using interface type使用接口类型查找子小部件
【发布时间】:2016-03-07 21:44:24
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

  • 原因是ParametrizedWidget应该是QObject。您可能希望创建一个具有相同接口而不是使用多重继承的基本 QWidget 类。
  • 好的,但是如果我还想在QPushButton 上使用ParametrizedWidget 接口怎么办?一些MyQPushButton 类将不得不从QPushButtonParametrizedWidget 继承——这两个类都将继承QObject。这令人困惑......
  • 这不是Qt提供的那种内省。 findChildren 仅适用于 QObject 子类。您可能想要遍历子列表并改用dynamic_cast
  • @peppe 我想我必须这样做
  • @TomášZato,为什么不简单地从QWidget 派生ParametrizedWidget 并得到类似:class MyWidget : public ParametrizedWidget

标签: c++ qt inheritance


【解决方案1】:

如 cmets 中所述,QObject::findChildren&lt;T&gt; 的模板参数必须是 QObject 的子类。

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

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

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

【讨论】:

  • 另一种选择:查看Q_DECLARE_INTERFACEQ_INTERFACES
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2021-10-23
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2016-12-09
相关资源
最近更新 更多