Использование QMDIArea с Qt 4.4.
-
10-07-2019 - |
Вопрос
Я использую QMdiArea
в Qt 4.4.
Если создается новый проект, я добавляю несколько вложенных окон в QMdiArea
. Я хотел бы запретить пользователю закрывать подокно во время выполнения. Подокна следует закрывать, только если закрыто все приложение или создан новый проект.
Как я могу это сделать?
Решение
Вам нужно определить свое собственное 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.
Другие советы
Вы бы сделали это так же, как для окна верхнего уровня: process, и проигнорировали отправленное им QCloseEvent. QMdiArea :: closeActiveSubWindow / QMdiArea :: closeAllSubWindows просто вызывает QWidget :: close, который отправляет closeEvent и подтверждает, что он был принят, прежде чем продолжить.
Вы можете обработать это событие, создав подкласс QMdiSubWindow и переопределив QWidget :: closeEvent, или используя фильтр событий для его перехвата.