1

我正在使用QMdiAreaQt 4.4 中的。

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

我怎样才能做到这一点?

4

2 回答 2

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();
    }
} 

您可能还需要覆盖close您的 mdi 区域的插槽。

于 2010-12-21T10:52:29.097 回答
1

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

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

于 2009-02-25T02:57:28.403 回答