#c #qt #qwidget #qmainwindow
#c #qt #qwidget #qmainwindow
Вопрос:
У меня есть класс (Window), который наследуется от QWidget (не QMainWindow). Это важная часть моей основной функции.
QApplication app (argc, argv);
QMainWindow *window = new QMainWindow;
QMenuBar *tool_bar = new QMenuBar (window);
Window *graph_area = new Window (arguments);
window->setMenuBar (tool_bar);
window->setCentralWidget (graph_area);
window->show ();
app.exec ();
Я думал, что просто переопределю «closeEvent», но по какой-то причине он не вызывается при нажатии кнопки закрытия.
Я хочу запретить пользователю закрывать приложение, если какой-то процесс все еще работает.
Есть идеи о том, как я мог бы этого добиться?
Ответ №1:
Вы можете либо:
-
Подкласс
QMainWindow
, вместоQWidget
-
Переопределить
QMainWindow::closeEvent
, вместоQWidget::closeEvent
-
Разместите свой
QMainWindow
подкласс в стеке, а не в куче, т.Е.:MyMainWindowSubclass window;
или:
Измените свой код на:
QApplication app(argc, argv);
Window w;
window->show();
app.exec();
и Window::closeEvent
будет вызван.
Ответ №2:
Сделайте свой класс Window фильтром событий и установите его в главном объекте window. Вы переопределите filterEvent
метод в Window. Не забудьте установить его в главном окне! И убедитесь, что фильтр отфильтровывает событие — логический результат указывает, пропускаете ли вы результат или отфильтровываете его. Найдите точное значение, необходимое для указания любого из них — это плохой API, и я никогда не помню, делает ли true или false то, что я намереваюсь. Это классический случай, когда возвращаемое значение перечисления будет работать лучше, например, Qt::Accept
/ Qt::Reject
или что-то подобное.
Ответ №3:
На самом деле я нашел другое решение своей проблемы, которое я нахожу более приятным. Я могу создать пользовательский класс mainwindow, который наследуется от QMainWindow, и использовать его вместо QMainWindow. Это может быть более подходящим, потому что мне, вероятно, понадобятся и некоторые другие изменения в QMainWindow.
Комментарии:
1. Что вы подразумеваете под другим решением ? Это первый вариант в моем ответе.
2. Извините, я не был уверен, что вы это имели в виду. Я все равно сделал ваш ответ ответом
3. Я всегда рад прочитать / услышать другое мнение / решение, однако на этот раз я был смущен, что вы имеете в виду под этим.