2010-03-02 2 views
3

Я хочу сохранить собственные DockWidgets (унаследованные от QDockWidget) с помощью функции saveState()/restoreState(), которую предоставляет MainWindow.Как сохранить пользовательские DockWidgets

У меня есть два вопроса: 1. Как я могу сохранить и восстановить свои Dockwidgets?
- Я уже пробовал регистрировать свои пользовательские DockWidgets как QMetaType и реализовывать стандартные конструкторы, копировать конструкторы, деструкторы и потоковые операторы.
2. Как определить загруженные DockWidgets?
- Например: Если 2 DockWidgets, где сохранено, и я загружаю их с помощью restoreState(), есть ли способ получить указатели на эти загруженные виджеты?

Спасибо, Tobias

+0

Просто проверить очевидное, но у вашего MainWindow есть указатели на 2 DockWidgets перед сохранением? – MSalters

+0

Я создаю DockWidgets и сохраняю указатели на них в моем собственном списке. Моя пользовательская DockWidget называется ConnectionWidget (унаследована от QDockWidget), а указатели находятся в списке QList ; Они добавляются в MainWindow с помощью addDockWidget. Если я вызову findChildren перед saveState(), я получаю все мои виджеты. Должен ли я сохранять указатели на свои DockWidgets где-то в другом месте? – Tobias

ответ

2

Вы прочитали документацию QMainWindow::saveState?

Являются ли ваши объекты уникально названными? (QObject::setObjectName)

В качестве примечания, объекты QObject НЕ должен иметь конструктор копирования см Q_DISABLE_COPY

+0

Да, я прочитал документацию, но я думаю, что она очень короткая и не говорит мне о том, что .. saveState, похоже, работает. Думаю, переменная состояния сохраняется в INI-файле. Но DockWidgets, похоже, тоже не сохраняются ... Да, я просто добавил статический счетчик, который добавляется ко всем именам объектов, только для целей тестирования. Я добавил конструктор копирования, потому что я стараюсь, он может работать как регистрация пользовательских мета-типов для сериализации. Благодарим вас за эту информацию о конструкторе копирования! – Tobias

+0

Вы вызывали setObjectName в экземплярах ваших виджетов док-станции? Это очень важно, поскольку Qt использует эти имена для многих вещей. Поддерживает ли восстановление из файла ini все остальное? Если нет, я бы проверил код, который вы используете для сохранения и восстановления, поскольку saveState возвращает QByteArray, который может быть забит кодировкой файла. –

+1

Да, я создаю свои DockWidgets и после этого вызова setObjectName (имя) на каждом из них с уникальным именем. Сохранение в настоящее время выполняется с помощью настроек-> setValue («mainwindow/state», this-> saveState()); Должен ли я кодировать/декодировать QByteArray, прежде чем записывать его в ini? Я использовал тот же код, что и в документации. Размер и положение моей Панели инструментов сохраняются и загружаются каждый раз, поэтому я думаю, что он работает, но мои пользовательские DockWidgets не будут восстановлены (я не знаю, как проверить, сохранены ли они). – Tobias

1

Я уже решил вопрос 2:
очень легко .. QList < QDockWidget * > dockWidgetList = findChildren < QDockWidget * >();
Но этот список в настоящее время пуст после загрузки, поскольку загружается виджет;)

1

Кажется, что вы не поняли что-то о restoreState - (?, Как это может сделать так или иначе) не будет воссоздавать прикрепляемые виджеты но просто восстановит их положение и статус (скрытый, свободный или состыкованный). Перед вызовом restoreState вам все равно придется создавать виджеты док-станции вручную.

+0

Хорошо, спасибо ! Я думал, что он может сериализовать эти Widgets в некотором роде или сохранить классы, из которых они были сделаны, чтобы автоматически воссоздать их. Поэтому мне нужно сохранить список всех открытых DockWidgets для себя и закрыть соответствующие DockWidgets снова при запуске, прежде чем вызвать restoreState(), я думаю .. – Tobias

Смежные вопросы