Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: babutta от Январь 21, 2010, 11:37



Название: QMainWindow не восстанавливает размеры centralWidget'a
Отправлено: babutta от Январь 21, 2010, 11:37
Добрый день.

Есть два приложения (Qt 4.5.1, VS 2005).
Оба приложения построены одинаково: главное окно с QDockWidget'ами, QToolBar'ами...

пользуюсь методами главного окна saveState() и restoreState().

одно приложение восстанавливает свое состояние нормально, а во втором доквиджеты притесняют центральный виджет.
Т.е. получается центральный виджет слева и справа сжат до минимальных размеров доквиджетами.
Причем, когда я закрываю доквиджеты слева и справа и оставляю только доквиджет снизу, то при перезапуске приложения центральный виджет сжат по вертикали нижним доквиджетом до минимальных размеров...

SizePolicy у доквиджетов не настраивал, ничего такого не крутил ни в одном приложении.

что может быть? как добиться нормального восстановления состояния главного окна?


Название: Re: QMainWindow не восстанавливает размеры centralWidget'a
Отправлено: fsMark от Январь 21, 2010, 13:24
Чтобы нормально работали saveState() и restoreState().. надо чтобы для всех обьектов которые сохраняются и восстанавливаются, были заданны имена (в дизанере например :))


Название: Re: QMainWindow не восстанавливает размеры centralWidget'a
Отправлено: babutta от Январь 21, 2010, 13:58
имена объектов заданы конечно (через setObjectName()) для всех уникальные, иначе бы этот механизм вообще не работал.
а он работает, только не так как должен =(


Название: Re: QMainWindow не восстанавливает размеры centralWidget'a
Отправлено: babutta от Январь 26, 2010, 14:08
В общем проблема решена... не без посторонних внимательных глаз =)
Ошибка была в том, что я пользовался конструктором и деструктором для восстановления и сохранения состояния соответственно...
так вот восстановление состояния на конструкторе было ошибкой...
как только перешел на closeEvent() и showEvent() так все и заработало =)


Название: Re: QMainWindow не восстанавливает размеры centralWidget'a
Отправлено: babutta от Май 27, 2010, 09:08
вот еще раз пришлось столкнуться с этим же... забыл как боролся и в поиске увидел свой пост, нашел свою ошибку и решил поправить =)

После внимательного прочтения ( целого абзаца! =) ) документации оказалось, что никто и не обещал восстановления геометрии главного окна при вызове метода restoreState().

В общем не важно где происходит сохранение в деструкторе или в closeEvent(), как, думаю, не важно и с восстановлением... Важно сохранять и восстанавливать (если это, конечно, требуется) и геометрию и состояние отдельно!

Вот так все работает:
Код:
ActionTest::ActionTest(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    QSettings s;

    restoreGeometry( s.value( APP_GEOMETRY, QByteArray() ).toByteArray() );
    restoreState( s.value( APP_STATE, QByteArray() ).toByteArray() );
}

ActionTest::~ActionTest()
{
    QSettings s;
    
    s.setValue( APP_STATE, saveState() );
    s.setValue( APP_GEOMETRY, saveGeometry() );
}