Russian Qt Forum
Май 12, 2024, 18:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов метода closeEvent  (Прочитано 1915 раз)
opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« : Январь 22, 2021, 14:26 »

Добрый день, есть виджет, родитель которого является главное окно, но при этом он представляет из себя самостоятельное окно с кнопками в правом верхнем углу |_|O|X| как только я нажимаю X главного окна,то вызывается метод void MyWidget::closeEvent( QCloseEvent * event )этого дочернего окна, хотя на на X(close) этого окна я не нажимаю вообще и метод close из главного окна для этого подокна не вызывется. Причем в RELEASE этот метод вызывается, а в DEBUG нет, почему так,объясните?
Записан
tux
Бывалый
*****
Offline Offline

Сообщений: 400



Просмотр профиля
« Ответ #1 : Январь 22, 2021, 14:35 »

А вы хотите, чтобы родитель умер, а ребенок был жив? Так не передавайте ему this - доживёт до старости! Улыбающийся
« Последнее редактирование: Январь 22, 2021, 14:38 от tux » Записан

opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #2 : Январь 22, 2021, 14:46 »

А вы хотите, чтобы родитель умер, а ребенок был жив? Так не передавайте ему this - доживёт до старости! Улыбающийся
Да, скажу сразу же, проект перекочевал для меня в наследство, я понимаю ,что просто надо было бы вместо this делать 0,я бы так сам и сделал, по другому просто даже не знаю, но там сделано по другому- остается this, если ставлю 0,то ломается другая логика проекта, переделывать все не хочу, поэтому и спрашиваю , что именно может вызывает действие closeEvent(вызов close нигде не нашел)?к тому же: и почему в release и debug разное поведение?Да и по callstack не вижу ничего кроме closeEvent
« Последнее редактирование: Январь 22, 2021, 15:00 от opera » Записан
tux
Бывалый
*****
Offline Offline

Сообщений: 400



Просмотр профиля
« Ответ #3 : Январь 22, 2021, 15:05 »

Родитель убивает все своих детей при закрытии главного окна.
Не хотите, чтобы дитё умирало - в его обработчике close Event выполните event->ignore();
Либо не передавайте дитю this.
Записан

opera
Чайник
*
Offline Offline

Сообщений: 93


Просмотр профиля
« Ответ #4 : Январь 22, 2021, 15:12 »

Родитель убивает все своих детей при закрытии главного окна.
Не хотите, чтобы дитё умирало - в его обработчике close Event выполните event->ignore();
Либо не передавайте дитю this.
Ничего подобного, сделал тестовый проект с MainWindow и Form1, где parent Form1=MainWindow ,где Form1-наследуется от QWidget:
Form1.cpp
Код:
Form1::Form1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form1)
{
    ui->setupUi(this);
    QPushButton * pb = new QPushButton("11111111111",this);

}

Form1::~Form1()
{
    delete ui;
}

void Form1::closeEvent( QCloseEvent * event )
{

}
MainWindow.cpp
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Form1 * f = new Form1(this);
    f->show();

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::closeEvent( QCloseEvent * event )
{

}


так вот при нажатии на X главного окна вызывается closeEvent для MainWindow, а потом сразу же деструктор ~Form1(), у Form1 closeEvent  не вызывается.
P.S. я тоже вначале думал,что вызывается вначале closeEvent родителя, а потом closeEvent ребенка, поэтому и сделал тестовый проект, но на нем вижу совсем другое
Записан
tux
Бывалый
*****
Offline Offline

Сообщений: 400



Просмотр профиля
« Ответ #5 : Январь 22, 2021, 15:24 »

Как вариант - очередной глюк винды. Улыбающийся
Там ещё есть занятный атрибут Qt::WA_DeleteOnClose - можно с ним поиграться.
Впрочем, позже посмотрю у себя.
P.S. Кстати, припоминаю, что подобный глюк уже был - когда можно было переопределить closeEvent только у наследника QMainWindow. Об этом даже неявно упоминает ассистент в документации креатора.
« Последнее редактирование: Январь 22, 2021, 15:31 от tux » Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.059 секунд. Запросов: 22.