设置父级的状态栏文本?

mpe*_*pen 4 qt design-patterns

我可以用我写的这个函数设置父级的状态栏文本

void EditorWindow::setStatusBarText(const QString& text) {
    statusBar()->showMessage(text);
}
Run Code Online (Sandbox Code Playgroud)

这样称呼(来自孩子)

((EditorWindow*) parent())->setStatusBarText(tr("%1, %2").arg(mousePos.x(), 0, 'f', 2).arg(mousePos.y(), 0, 'f', 2));
Run Code Online (Sandbox Code Playgroud)

但我很确定这打破了一些设计原则.例如,如果parent()不是EditorWindow*

那么解决方法是什么呢?强制用户EditorWindow在创建时传递引用以确保父类型的类型正确?

roh*_*npm 10

使用信号和插槽;

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)));
    ...
}
Run Code Online (Sandbox Code Playgroud)

那么孩子就emit statusEvent(somestring)应该更新状态.

这可以很好地扩展,您可以拥有任意数量的子窗口小部件,可以更改状态文本,他们对父窗口小部件一无所知,您可以在父窗口小部件中实现策略以接受或拒绝状态更新来自儿童小部件.

  • 你实际上并不需要setStatusBarText函数,可以直接使用showMessage:connect(editorView,SIGNAL(statusBarUpdate(QString)),statusBar(),SLOT(showMessage(QString))); (3认同)