代码之家  ›  专栏  ›  技术社区  ›  mpen

设置父级的状态栏文本?

  •  3
  • mpen  · 技术社区  · 16 年前

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

    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 在创建时确保父级是正确的类型?

    1 回复  |  直到 15 年前
        1
  •  9
  •   rohanpm    16 年前

    使用信号和插槽;

    制作 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) 何时应更新状态。

    这可以很好地扩展,您可以拥有任意多的子窗口小部件,这些小部件可以更改状态文本,它们对其父窗口小部件一无所知,您可以在父窗口小部件中实施策略,以接受或拒绝子窗口小部件的状态更新。

    推荐文章