Russian Qt Forum

Qt => Общие вопросы => Тема начата: troorl от Июнь 06, 2007, 15:33



Название: Сохранение настроек при закрытии программы
Отправлено: troorl от Июнь 06, 2007, 15:33
Есть главное окно. В деструктор записываю сохранение позиции и размера этого окна. При выходе они по идее должны сохраняться (qApp->quit()). Но не сохраняются.
Но если в конце деструктора прописать что-то типа
Код:
QMessageBox::information(0, "", '');

то настройки успевают сохраниться. Как это правильно реализовать?


Название: Сохранение настроек при закрытии программы
Отправлено: goer от Июнь 06, 2007, 15:36
попробуй поставить qApp->processEvents() после функции сохранения, если не получится - сделай паузу при помощи QEventLoop. Кажется в теме про QString(та которая на 4 старницы, чуть ниже) было как это сделать.


Название: Сохранение настроек при закрытии программы
Отправлено: troorl от Июнь 06, 2007, 15:48
Спасибо, qApp->processEvents() вроде помогло.


Название: Re: Сохранение настроек при закрытии программы
Отправлено: pastor от Июнь 06, 2007, 16:40
Цитата: "troorl"

Как это правильно реализовать?


имхо в деструкторе сохранять настройки это не совсем корректное решение. Объект начал уже разрушаться, сосотояние объектов может быть неопределённым. Я наталкнулся на такой косяк и переделал по другому:

Код:
void MainWindow::closeEvent ( QCloseEvent * evnt )
{
    if (<запрос о закрытии приложения>) {
        <сохранение настроек>
        evnt->accept();
        return;
    }
    evnt->ignore();
}


Название: Re: Сохранение настроек при закрытии программы
Отправлено: Sergey B. от Июнь 06, 2007, 17:39
Цитата: "pastor"
Цитата: "troorl"

Как это правильно реализовать?


имхо в деструкторе сохранять настройки это не совсем корректное решение. Объект начал уже разрушаться, сосотояние объектов может быть неопределённым. Я наталкнулся на такой косяк и переделал по другому:

Код:
void MainWindow::closeEvent ( QCloseEvent * evnt )
{
    if (<запрос о закрытии приложения>) {
        <сохранение настроек>
        evnt->accept();
        return;
    }
    evnt->ignore();
}


именно так и надо, т.к. для того события в ней и созданы (сигнал-слот)