2008-11-24 6 views
1

J'utilise le QMdiArea en Qt 4.4.Utilisation de QMDIArea avec Qt 4.4.

Si un nouveau projet est créé, j'ajoute un certain nombre de sous-fenêtres à un QMdiArea. Je voudrais interdire à l'utilisateur de fermer une sous-fenêtre pendant l'exécution. Les sous-fenêtres ne doivent être fermées que si l'application entière est fermée ou si un nouveau projet est créé.

Comment est-ce que je peux faire ceci?

+0

Pourriez-vous sous-classer QMdiArea et remplacer les méthodes par défaut closeActiveSubWindow/closeAllSubWindows pour ne pas fermer la fenêtre lorsque l'utilisateur le demande? – Tuminoid

Répondre

3

Vous devez définir votre propre subWindow. créez une sous-classe QMdiSubWindow et remplacez la closeEvent(QCloseEvent *closeEvent). vous pouvez le contrôler par argument. par exemple:

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 ... 
} 

sous-classe puis la QMdiArea et substituez QMdiArea::closeAllSubWindows() comme ceci:

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

vous pouvez aussi avoir besoin de passer outre sous close de votre zone IMD.

+0

Oui, c'est une posibilité. Il ne supprime pas le "x" dans le coin supérieur droit, mais cela fonctionne bien. En fait je cherchais une solution qui supprime bien ce "x" aussi. – nutario

+0

Probablement, vous pouvez surmonter en ré-implémentant l'événement de peinture de mdiArea ... mais c'est difficile. –

1

Vous feriez la même chose que pour une fenêtre de niveau supérieur: traitez et ignorez le QCloseEvent envoyé. QMdiArea :: closeActiveSubWindow/QMdiArea :: closeAllSubWindows appelle simplement QWidget :: close, qui envoie un closeEvent et confirme qu'il a été accepté avant de continuer.

Vous pouvez traiter cet événement par le sous-classement QMdiSubWindow et réimplémenter QWidget :: closeEvent, ou en utilisant un filtre d'événements pour l'intercepter ..