使用QMDIArea和Qt 4.4。

时间:2008-11-24 19:59:33

标签: c++ qt user-interface qt4 qmdiarea

我在Qt 4.4中使用QMdiArea

如果创建了一个新项目,我会向QMdiArea添加一些子窗口。我想禁止用户在运行时关闭子窗口。只有在关闭整个应用程序或创建新项目时才应关闭子窗口。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您需要定义自己的subWindow。创建QMdiSubWindow的子类并覆盖closeEvent(QCloseEvent *closeEvent)。你可以通过参数来控制它。例如:

void ChildWindow::closeEvent(QCloseEvent *closeEvent)
{
  if(/*condition C*/)
    closeEvent->accept();
  else
   closeEvent->ignore(); // you can do something else, like 
                         // writing a string in status bar ...
}
然后

继承QMdiArea并覆盖QMdiArea::closeAllSubWindows (),如下所示:

class MainWindowArea : public QMdiArea
{
    Q_OBJECT
public:
    explicit MainWindowArea(QWidget *parent = 0);

signals:
    void closeAllSubWindows();
public slots:

};
// Implementation:
MainWindowArea::closeAllSubWindows()
{
    // set close condition (new project is creating, C = true)
    foreach(QMdiSubWindow* sub,this->subWindowList())
    {
        (qobject_cast<ChildWindow*>(sub))->close();
    }
} 

您可能还需要覆盖mdi区域的close位置。

答案 1 :(得分:1)

您执行此操作与顶级窗口相同:处理并忽略它发送的QCloseEvent。 QMdiArea :: closeActiveSubWindow / QMdiArea :: closeAllSubWindows只调用QWidget :: close,它发送一个closeEvent并确认它在继续之前已被接受。

您可以通过继承QMdiSubWindow并重新实现QWidget :: closeEvent或使用事件过滤器拦截它来处理此事件。