Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: alexman от Сентябрь 10, 2008, 16:38



Название: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Сентябрь 10, 2008, 16:38
   Я работаю в Qt 4.4.0.
   Столкнулся с такой проблемой: есть главное окно (наследник от QMainWindow) и есть различные tool bar'ы и dock widget'ы, расположенные на этом окне. Я делаю следующее: есть tool bar, затем я его "скрываю" (делаю hide()), затем сохраняю положение с помощью saveGeometry() и saveState(), а затем снова открываю окно и загружаю настройки с помощью функций restoreGeometry() И restoreState(), но tool bar располагается не там где был до закрытия и до того как я его "скрыл"!
   Может кто-нибудь сталкивался уже с этим и знает в чём проблема?


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: pastor от Сентябрь 10, 2008, 17:09
Есть репорт по этому поводу:

http://trolltech.com/developer/task-tracker/index_html?method=entry&id=225993

Я сталкивался с подобной ситуацией, тока она была связана с доквиджетом:

http://trolltech.com/developer/task-tracker/index_html?id=197086&method=entry


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: ритт от Сентябрь 10, 2008, 19:18
а setObjectName тулбару делаем?


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: ритт от Сентябрь 10, 2008, 22:12
приведи код, которым создаёшь тулбары, сохраняешь и восстанавливаешься геомметрию
желательно максимально приближённый к "боевому"...а то и вообще компилябельный проект, на котором можно было бы поковырять данную проблему

у меня подобный функционал работает как положено...правда, бывают "скачки" при смене стиля


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Сентябрь 10, 2008, 23:47
Создание toolbar:
Код:
QToolBar* initBar( const int type, QMainWindow* mw )
{
    QToolBar* bar = 0;
    QObject* wid = 0;

    switch ( type ) {
    /*another code*/
    case MapToolBars::ContoursBar:
        bar = new QToolBar( mw );
        wid = new ContoursToolbar( bar, mw );
        bar->setCaption( QObject::tr( "Contours Toolbar" ) );
        bar->setObjectName( "Contours Toolbar" );
        break;
    /*another code*/
    }

    if ( bar ) {
        mw->addToolBar( bar );
        /*another code*/
    }

    return bar;
}

Конструктор ContoursToolbar:
Код:
ContoursToolbar::ContoursToolbar( QToolBar* parent, QMainWindow* mw )
:  QObject( parent )
{
d = new ContoursToolbarPrivate;

d->showSettings = new QAction( tr( "Contours Settings" ), parent );
d->showSettings->setIconSet( QPixmap( ":/contours.png" ) );
d->showSettings->setToggleAction( false );
d->showSettings->setStatusTip( tr( "Contours Settings" ) );
connect( d->showSettings, SIGNAL( activated() ), SLOT( showSettings() ) );

parent->addAction( d->showSettings );

d->dlg = new ContoursSettingsDialog( mw );
}

Сохранение настроек:
Код:
void MainWindow::writeSettings()
{
QSettings settings( ... );
settings.beginGroup( "Map" );
settings.setValue( "Geometry", saveGeometry() );
settings.setValue( "State", saveState() );
                /*another code*/
settings.endGroup();
}
Загрузка настроек:
Код:
void MainWindow::writeSettings()
{
QSettings settings( ... );
settings.beginGroup( "Map" );
restoreGeometry( settings.setValue( "Geometry" ).toByteArray() );
restoreState( settings.setValue( "State" ).toByteArray() );
                /*another code*/
settings.endGroup();
}

P.S. перед сохранением этот toolbar сначала показывался, а потом был скрыт. Создаётся не один toolbar, а несколько.


**********
Незабываем пользоваться тегом КОД для формитирования исходного кода


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: ритт от Сентябрь 13, 2008, 15:32
вот мой код сохранения/восстановления геометрий главного окна (здеь вырезки. естественно, сам код более осмысленный и полный):
Код:
MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) : QMainWindow(parent, flags)
{
QSettings* settings = Helper::settings();
if(!restoreGeometry(settings->value("Window/geometry").toByteArray()))
showMaximized();
//...
QDockWidget* navigationDockWidget = new QDockWidget(tr("Navigation"), this);
navigationDockWidget->setObjectName("Navigation");

NavigationTree* navigationTree = new NavigationTree(navigationDockWidget);

navigationDockWidget->setWidget(navigationTree);
navigationDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
addDockWidget(Qt::LeftDockWidgetArea, navigationDockWidget, Qt::Vertical);
//...
mainToolBar = new QToolBar(tr("Main ToolBar"), this);
mainToolBar->setObjectName("MainToolBar");
addToolBar(Qt::TopToolBarArea, mainToolBar);

addToolBarBreak(Qt::TopToolBarArea);
//...
restoreState(settings->value("Window/state").toByteArray());
}

MainWindow::~MainWindow()
{
QSettings* settings = Helper::settings();
settings->beginGroup("Window");
settings->setValue("geometry", saveGeometry());
settings->setValue("state", saveState());
settings->endGroup();
}

проблемы только с доквиджетами - они до сих пор неполностью восстанавливают геометрию - и с тулбарами при смене стиля - иногда тулбары "прыгают" по иксу


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: andrew.k от Декабрь 21, 2010, 12:30
Вы как бывалые подскажите мне. У меня тоже QMainWindow разделенный несколькими сплиттерами на области.
Я делал saveState() и saveGeometry() для самой формы. это не сохраняет их положение.
Достаточно ли делать saveState() для главной формы и я что-то делаю не так или нужно отдельно для каждого сплиттера?
А насчет objectName, он же задается автоматически при компиляции ui-файла.


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: GreatSnake от Декабрь 21, 2010, 13:27
А что описание QMainWindow::save/restoreState() (http://doc.trolltech.com/latest/qmainwindow.html#restoreState) в ассистенте не судьба посмотреть?
Там же всё расписано что и как сохраняется и восстанавливается.


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Декабрь 21, 2010, 13:29
Код:
QByteArray QSplitter::saveState () const
bool QSplitter::restoreState ( const QByteArray & state )


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: andrew.k от Декабрь 21, 2010, 19:08
Там ничего не написано про сплиттер.


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Декабрь 21, 2010, 19:17
Так делай для сплитера отдельно!


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: andrew.k от Декабрь 21, 2010, 19:34
Спасибо, Кэп!


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: GreatSnake от Декабрь 21, 2010, 19:55
Цитировать
Там ничего не написано про сплиттер.
Правильно, т.к. QSplitter самостоятельный виджет и не имеет никакого отношения к QMainWindow, в отличие от QToolBar и QDockWidget.


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: andrew.k от Декабрь 22, 2010, 11:53
Цитировать
Там ничего не написано про сплиттер.
Правильно, т.к. QSplitter самостоятельный виджет и не имеет никакого отношения к QMainWindow, в отличие от QToolBar и QDockWidget.
А что такое самостоятельный? Чем он хуже Тулбара?
Он имеет такое же отношение к QMainWindow, как дпсник к дорожному движению.
Дпсник тоже самостоятельный и не имеет никакого отношения к дорожному движению? :)


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Декабрь 22, 2010, 11:58
Цитировать
Там ничего не написано про сплиттер.
Правильно, т.к. QSplitter самостоятельный виджет и не имеет никакого отношения к QMainWindow, в отличие от QToolBar и QDockWidget.
А что такое самостоятельный? Чем он хуже Тулбара?
Он имеет такое же отношение к QMainWindow, как дпсник к дорожному движению.
Дпсник тоже самостоятельный и не имеет никакого отношения к дорожному движению? :)
Из Qt Assistant:
Цитировать
QByteArray QMainWindow::saveState ( int version = 0 ) const
Saves the current state of this mainwindow's toolbars and dockwidgets.
То есть состоянием и геометрией центрального виджета вы должны сами управлять. Центральный виджет не имеет никакого отношения к докам и тулбарам!


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: andrew.k от Декабрь 22, 2010, 12:38
Теперь правильно :)
разговариваем ни о чем )


Название: Re: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?
Отправлено: alexman от Декабрь 22, 2010, 16:01
Вот именно!