Как я могу остановить закрытие виджета QT?

#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:

Вы можете либо:

  1. Подкласс QMainWindow , вместо QWidget

  2. Переопределить QMainWindow::closeEvent , вместо QWidget::closeEvent

  3. Разместите свой 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. Я всегда рад прочитать / услышать другое мнение / решение, однако на этот раз я был смущен, что вы имеете в виду под этим.