使用接口类型查找子窗口小部件
Finding child widgets using interface type
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();
}
}
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- QT-如何通过按下按钮从子窗口小部件返回到父窗口小部件
- 如何将QEvents传递给子窗口小部件
- 如何在子小部件而不是父窗口小部件上绘制一条线
- 如何识别子窗口小部件中的QMouseEvent
- 错误编译QT创建者 / QT窗口小部件示例
- 单击另一个小组件时将窗口小部件标记为未选中
- 在父窗口/小部件类中初始化子小部件的目的是什么?
- 当光标不在窗口小部件上时,QT小部件检测鼠标事件
- 如何在父窗口小部件的右侧绘制
- C++ 创建小部件数组
- 在Qt5中的多个弹出窗口小部件上接收鼠标EnterEvent和LeaveEvent
- 在Qt窗口小部件/QWindow上显示供过于求窗口
- Qt 删除窗口小部件
- 通过按钮访问父窗口小部件的变量
- WinAPI CreateWindow函数创建的窗口比设置的窗口小
- 如何使QWidget(或QDialog)以其父窗口小部件为中心
- 无法对Qt5中的窗口小部件进行聚焦和输入
- 选项卡化所有停靠窗口小部件
- 使用接口类型查找子窗口小部件