Название: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 01:46 Такая вот проблемма. Пользуюсь saveState() и restoreState(). При перезапуске все ТулБары восстанавливает, а QDockWidget как был по умолчанию слева, так и остается. хотя в Аситенте написанно
Цитировать Restores the state of this mainwindow's toolbars and dockwidgets. можно конечно поивращаться с dockWidgetArea() и removeDockWidget()+addDockWidget(), но всетаки хочеться сделать "как правильно"Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: crocus от Июль 14, 2008, 02:23 Может забыл:
Код: dock->setObjectName("DockName"); Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: ритт от Июль 14, 2008, 03:49 старая бага (http://trolltech.com/developer/task-tracker/index_html?id=146752&method=entry)
статус "резолвед", но на деле нихера не изменилось как вариант можно пользовать наследника доквиджета из поделия под названием Qxt (http://docs.libqxt.org/classQxtDockWidget.html) Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 08:44 старая бага (http://trolltech.com/developer/task-tracker/index_html?id=146752&method=entry) Спасибо, но думаю реализую просто подругому.статус "резолвед", но на деле нихера не изменилось как вариант можно пользовать наследника доквиджета из поделия под названием Qxt (http://docs.libqxt.org/classQxtDockWidget.html) так у меня насройки применяются в конце конструктора, но думаю напишу функцию, которая возвращает Qt::DockWidgetArea, а поле в файле настроек сделать как поле со строковым значением, которое через case будет возвращать необходимый Qt::DockWidgetArea. А записать в настройки можно с помощью dockWidgetArea(QDockWidget * dockwidget). Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 10:11 нашел такой пример demos\mainwindow
там можно сохранять настройки в файл и загружать их. расположение QDockWidget сохраняется. пытаюсь сделать как там: Цитировать restoreGeometry(settings.value("GeometryState").toByteArray()); иrestoreState(settings.value("ToolBarsState").toByteArray()); Цитировать settings.setValue("GeometryState", saveGeometry()); расположение главного окна сохраняется, а Док Виджетов нет. =( хотя там вроде также делается. может кто подскажет что я не так делаюsettings.setValue("ToolBarsState", saveState()); Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: mal от Июль 14, 2008, 16:43 заведи банально флажок слева справа и сохраняй его в реестре предположим, потом читай и стыкуй как тебе требуется.
кусочек кода: Код: bool editor_docked_left=false;//флажок по которому смотрю куда стыкуется, при работе меняю стыковку по желанию юзера право-лево Используй тэг КОД для форматирования кода! Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: ритт от Июль 14, 2008, 17:22 аа...так тебя только расположение беспокоит? какая версия кутэ? 4.4.0, 4.3.4 - с расположением проблем нет.
Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 19:21 спасибо всем за ответы. версия 4.4.0. а сделал так
Цитировать Area EditorMainWindow::loadNavigatorState() загружаю расположение при создании QDockWidget и присоединении к QMainWindow:{ return (Area)settings.value("/Navigator/DockArea",Qt::LeftDockWidgetArea).toInt(); } void EditorMainWindow::loadSettings() { settings.beginGroup("Navigator"); databaseDockWidget->setVisible(settings.value("Visible", true).toBool()); dataBaseNavigator->setProperty("NumberColumnWidth", settings.value("NumberColumnWidth", 0).toInt()); dataBaseNavigator->setProperty("TextColumnWidth", settings.value("TextColumnWidth", 0).toInt()); settings.endGroup(); settings.beginGroup("View"); viewHighlight->setChecked(settings.value("Highlight", false).toBool()); restoreGeometry(settings.value("GeometryState").toByteArray()); restoreState(settings.value("ToolBarsState").toByteArray()); splitterState=settings.value("SplitterState").toByteArray(); settings.endGroup(); } void EditorMainWindow::saveSettings() { settings.beginGroup("Navigator"); settings.setValue("Visible", databaseDockWidget->isVisible()); settings.setValue("DockArea", dockWidgetArea(databaseDockWidget)); dataBaseNavigator->setProperty("NumberColumnWidth", dataBaseNavigator->columnWidth(0)); dataBaseNavigator->setProperty("TextColumnWidth", dataBaseNavigator->columnWidth(1)); settings.setValue("NumberColumnWidth", dataBaseNavigator->property("NumberColumnWidth").toInt()); settings.setValue("TextColumnWidth", dataBaseNavigator->property("TextColumnWidth").toInt()); settings.endGroup(); settings.beginGroup("View"); settings.setValue("Highlight", viewHighlight->isChecked()); settings.setValue("GeometryState", saveGeometry()); settings.setValue("ToolBarsState", saveState()); if(activeDocument!=0) splitterState=activeDocument->splitter->saveState(); settings.setValue("SplitterState", splitterState); settings.endGroup(); } Цитировать addDockWidget(loadNavigatorState(), databaseDockWidget); работает все как надо, разве что не сохраняется если виджет отстыкован и висит в виде окна. но это особо и не нужно.Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 19:40 а что кстате означает
Цитировать Отладка... (gdb) (gdb) (gdb) (gdb) (gdb) Starting program: E:/My Documents/My Files/Tester/debug/editor.exe Program exited normally. (gdb) warning: QMainWindow::saveState(): 'objectName' not set for QDockWidget 048F5F60 'Database Navigator; warning: QMainWindow::saveState(): 'objectName' not set for QToolBar 049181A8 'File Actions' warning: QMainWindow::saveState(): 'objectName' not set for QToolBar 04920CF0 'Format Actions' ---------------------- Отладка завершена ---------------------- Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: ритт от Июль 14, 2008, 19:45 Может забыл: Код: dock->setObjectName("DockName"); Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 20:14 Может забыл: Код: dock->setObjectName("DockName"); Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: ритт от Июль 14, 2008, 22:14 ну, мля, это ещё в самом начале было указано!
на ворнинги внимания не обращаем, документацию не читаем... Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: Hort от Июль 14, 2008, 23:37 ну, мля, это ещё в самом начале было указано! сори шото я туплю... :-[на ворнинги внимания не обращаем, документацию не читаем... в начале сразу прочел что баг известный и на него забил, начал сам до ума доводить. Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: ритт от Июль 15, 2008, 03:10 ну, ночь была - я не шибко внимательно прочитал сообщение и выдал на гора очевидное - то, с чем сам когда-то сталкивался...тем-более, что крокус уже высказал _самую_ распространённую проблему - человекам лень читать документацию и хочется сразу готового...
Название: Re: restoreState() не восстанавлиает положение QDockWidget Отправлено: manarch от Октябрь 27, 2008, 13:43 ну я конечно немного позновато но все же... у меня в 4.4.0 тоже сначало проблема была, но потом понял в чем проблема.
я так понял что функция saveState собирает информацию о состоянии всех QDockWidget и сохраняет её в QByteArray под именем заданным функцией setObjectName, а функция restoreState соответственно перебирает все виджеты и сравнивает их имя с именем в массиве и если совпали то присваивает её записанные значения. Поэтому для того чтобы все QToolBar'ы и QDockWidget'ы приняли записанные значений нужно вызывать restoreState после того ка созданы ВСЕ виджеты. Это описание мое лично наблюдение и не претендует на точность, но после того как я перенес загрузку настроек после инициализации всех виджетов у меня все заработало нормально, включая остыкованные и висящие виджеты. |