Russian Qt Forum
Ноябрь 01, 2024, 18:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сохранение геометрии и состояния tool bar'ов и dock widget'ов главного окна!?  (Прочитано 13734 раз)
alexman
Гость
« : Сентябрь 10, 2008, 16:38 »

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

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Сентябрь 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
« Последнее редактирование: Сентябрь 10, 2008, 17:16 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #2 : Сентябрь 10, 2008, 19:18 »

а setObjectName тулбару делаем?
Записан
ритт
Гость
« Ответ #3 : Сентябрь 10, 2008, 22:12 »

приведи код, которым создаёшь тулбары, сохраняешь и восстанавливаешься геомметрию
желательно максимально приближённый к "боевому"...а то и вообще компилябельный проект, на котором можно было бы поковырять данную проблему

у меня подобный функционал работает как положено...правда, бывают "скачки" при смене стиля
Записан
alexman
Гость
« Ответ #4 : Сентябрь 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, а несколько.


**********
Незабываем пользоваться тегом КОД для формитирования исходного кода
« Последнее редактирование: Сентябрь 11, 2008, 11:11 от pastor » Записан
ритт
Гость
« Ответ #5 : Сентябрь 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();
}

проблемы только с доквиджетами - они до сих пор неполностью восстанавливают геометрию - и с тулбарами при смене стиля - иногда тулбары "прыгают" по иксу
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 21, 2010, 12:30 »

Вы как бывалые подскажите мне. У меня тоже QMainWindow разделенный несколькими сплиттерами на области.
Я делал saveState() и saveGeometry() для самой формы. это не сохраняет их положение.
Достаточно ли делать saveState() для главной формы и я что-то делаю не так или нужно отдельно для каждого сплиттера?
А насчет objectName, он же задается автоматически при компиляции ui-файла.
« Последнее редактирование: Декабрь 21, 2010, 12:38 от andrew.k » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Декабрь 21, 2010, 13:27 »

А что описание QMainWindow::save/restoreState() в ассистенте не судьба посмотреть?
Там же всё расписано что и как сохраняется и восстанавливается.
Записан

Qt 5.11/4.8.7 (X11/Win)
alexman
Гость
« Ответ #8 : Декабрь 21, 2010, 13:29 »

Код:
QByteArray QSplitter::saveState () const
bool QSplitter::restoreState ( const QByteArray & state )
Записан
andrew.k
Гость
« Ответ #9 : Декабрь 21, 2010, 19:08 »

Там ничего не написано про сплиттер.
Записан
alexman
Гость
« Ответ #10 : Декабрь 21, 2010, 19:17 »

Так делай для сплитера отдельно!
Записан
andrew.k
Гость
« Ответ #11 : Декабрь 21, 2010, 19:34 »

Спасибо, Кэп!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Декабрь 21, 2010, 19:55 »

Цитировать
Там ничего не написано про сплиттер.
Правильно, т.к. QSplitter самостоятельный виджет и не имеет никакого отношения к QMainWindow, в отличие от QToolBar и QDockWidget.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #13 : Декабрь 22, 2010, 11:53 »

Цитировать
Там ничего не написано про сплиттер.
Правильно, т.к. QSplitter самостоятельный виджет и не имеет никакого отношения к QMainWindow, в отличие от QToolBar и QDockWidget.
А что такое самостоятельный? Чем он хуже Тулбара?
Он имеет такое же отношение к QMainWindow, как дпсник к дорожному движению.
Дпсник тоже самостоятельный и не имеет никакого отношения к дорожному движению? Улыбающийся
Записан
alexman
Гость
« Ответ #14 : Декабрь 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.
То есть состоянием и геометрией центрального виджета вы должны сами управлять. Центральный виджет не имеет никакого отношения к докам и тулбарам!
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.257 секунд. Запросов: 22.