Usando QMDIArea con Qt 4.4.
-
10-07-2019 - |
Pregunta
Estoy usando el QMdiArea
en Qt 4.4.
Si se crea un nuevo proyecto, agrego varias subventanas a un QMdiArea
. Me gustaría no permitir que el usuario cierre una ventana secundaria durante el tiempo de ejecución. Las subventanas solo deben cerrarse si se cierra toda la aplicación o si se crea un nuevo proyecto.
¿Cómo puedo hacer esto?
Solución
Necesita definir su propia subWindow
. cree una subclase de QMdiSubWindow
y anule el closeEvent (QCloseEvent * closeEvent)
. Puedes controlarlo con argumentos. por ejemplo:
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 ...
}
luego subclase QMdiArea
y anule QMdiArea :: closeAllSubWindows ()
de esta manera:
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();
}
}
también es posible que deba anular la ranura close
de su área mdi.
Otros consejos
Harías lo mismo que para una ventana de nivel superior: procesa e ignora el QCloseEvent que envió. QMdiArea :: closeActiveSubWindow / QMdiArea :: closeAllSubWindows solo llame a QWidget :: close, que envía un closeEvent y confirma que fue aceptado antes de continuar.
Puede procesar este evento subclasificando QMdiSubWindow y reimplementando QWidget :: closeEvent, o usando un filtro de eventos para interceptarlo ...