Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Hort от Июль 14, 2008, 01:46



Название: 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;//флажок по которому смотрю куда стыкуется, при работе меняю стыковку по желанию юзера право-лево

при закрытии проги сохраняем куда стыковать
запись:
//настройки редактора
settings.beginGroup("Editor");
...
settings.setValue("docked_left", editor_docked_left);
...
settings.endGroup();

в конструкторе зовем фунцайку где в том числе читаю куда стыковать
чтение:
//расположение редактора
editor_docked_left = false;
settings.beginGroup("Editor");
...
editor_docked_left = settings.value("docked_left").toBool();//пристыкованный где ()
...
settings.endGroup();

потом зову фунцайку где стыкую редактор куда надо

//настройки редактора при старте
void Class::set_editor()
{
...
//куда стыковать -  по умолчанию стыковка вправо
if(editor_docked_left)
{
//стыкуем влево
slot_dock_edit_left();
}
else
{
                slot_dock_edit_right();//соответственно вправо
}
}

//стыковать редактор справа
void Class::slot_dock_edit_right()
{
removeDockWidget(editorDockWidget);
addDockWidget(Qt::RightDockWidgetArea, editorDockWidget);
restoreDockWidget ( editorDockWidget);
editor_docked_left = false;
}

//стыковать редактор слева
void Class::slot_dock_edit_left()
{
removeDockWidget(editorDockWidget);
addDockWidget(Qt::LeftDockWidgetArea, editorDockWidget);
restoreDockWidget ( editorDockWidget);
editor_docked_left = true;
}

Используй тэг КОД для форматирования кода!


Название: 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()
{
   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();
}
загружаю расположение при создании QDockWidget и присоединении к QMainWindow:
Цитировать
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 после того ка созданы ВСЕ виджеты. Это описание мое лично наблюдение и не претендует на точность, но после того как я перенес загрузку настроек после инициализации всех виджетов у меня все заработало нормально, включая остыкованные и висящие виджеты.