在Qt 4.4中使用QMDIArea。

问题描述:

我正在使用Qt 4.4中的QMdiArea在Qt 4.4中使用QMDIArea。

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

我该怎么做?

+0

你可以子类QMdiArea和重写默认closeActiveSubWindow/closeAllSubWindows方法不会关闭窗口时,用户请求它? – Tuminoid 2008-12-04 08:52:04

您需要定义自己的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插槽。

+0

是的,这是一个可能性。它不会删除右上角的“x”,但它的工作原理正确。其实我正在寻找一个解决方案,虽然也删除了这个“x”。 – nutario 2010-12-30 09:59:05

你会这样做的*窗口相同:处理并忽略它发送的QCloseEvent。 QMdiArea :: closeActiveSubWindow/QMdiArea :: closeAllSubWindows只需调用QWidget :: close,它会在继续之前发送一个closeEvent并确认它已被接受。

可以,或者通过使用事件过滤器拦截它处理通过继承QMdiSubWindow和重新实现了QWidget ::这的closeEvent事件..