【发布时间】: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类将不得不从QPushButton和ParametrizedWidget继承——这两个类都将继承QObject。这令人困惑...... -
这不是Qt提供的那种内省。
findChildren仅适用于QObject子类。您可能想要遍历子列表并改用dynamic_cast。 -
@peppe 我想我必须这样做
-
@TomášZato,为什么不简单地从
QWidget派生ParametrizedWidget并得到类似:class MyWidget : public ParametrizedWidget?
标签: c++ qt inheritance