我可以使用我编写的这个函数设置父级的状态栏文本
void EditorWindow::setStatusBarText(const QString& text) {
statusBar()->showMessage(text);
}
这样称呼(来自孩子)
((EditorWindow*) parent())->setStatusBarText(tr("%1, %2").arg(mousePos.x(), 0, 'f', 2).arg(mousePos.y(), 0, 'f', 2));
但我很确定这打破了一些设计原则。例如,如果parent()
不是EditorWindow*
?
那么解决方法是什么?强制用户在创建时传递对EditorWindow
的引用,以确保父类型的类型正确吗?
答案 0 :(得分:9)
使用信号和插槽;
让EditorWindow::setStatusBarText
成一个插槽。在孩子想要更改状态时给孩子一个信号,并将其连接到setStatusBarText
位置。
// make setStatusBarText a slot...
class EditorWindow : public QWidget {
Q_OBJECT
...
public slots:
void setStatusBarText(const QString&);
}
// make a signal to be emitted when status should change:
class SomeChildWidget : public QWidget {
Q_OBJECT
...
signals:
void statusEvent(const QString&);
}
// connect them up when appropriate
EditorWindow::EditorWindow()
: QWidget()
{
...
m_childWidget = new SomeChildWidget(this);
connect(m_childWidget, SIGNAL(statusEvent(QString)),
this, SLOT(setStatusBarText(QString)));
...
}
然后,当状态应该更新时,孩子会emit statusEvent(somestring)
。
这可以很好地扩展,您可以拥有任意数量的子窗口小部件,可以更改状态文本,他们对父窗口小部件一无所知,您可以在父窗口小部件中实现策略以接受或拒绝来自子窗口小部件的状态更新。