В проге нужны перетаскивающиеся окна, создаю их таким образом:
dock[DW_RESOURCE_BROWSER] = new QDockWidget( "Resouce browser", this );
toggleViewAction[DW_RESOURCE_BROWSER] = dock[DW_RESOURCE_BROWSER]->toggleViewAction();
...
dock[DW_RESOURCE_BROWSER]->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
dock[DW_RESOURCE_BROWSER]->setWidget( resourceBrowser );
viewMenu->addAction( toggleViewAction[DW_RESOURCE_BROWSER] );
addDockWidget( Qt::RightDockWidgetArea, dock[DW_RESOURCE_BROWSER] );
ну глянь пример %QTDIR%\demos\mainwindow
там есть возможность сохранять настройки окна и положение подокон, а также загружать их.
Посмотри как реализована загрузка, что и как настраивается.
Там это сделано через save/restore geometry
Скопипастил загрузку настроек в конструктор, сохранение - в closeEvent
// ** Загрузка
QEditorWindow::QEditorWindow( void )
{
...
QString fileName = "settings.set";
QFile file( fileName );
if( !file.open( QFile::ReadOnly ) ) {
QMessageBox::warning(this, tr("Error"), "");
return;
}
uchar geo_size;
QByteArray geo_data;
QByteArray layout_data;
bool ok = file.getChar((char*)&geo_size);
if (ok) {
geo_data = file.read(geo_size);
ok = geo_data.size() == geo_size;
}
if (ok) {
layout_data = file.readAll();
ok = layout_data.size() > 0;
}
if (ok)
ok = restoreGeometry(geo_data);
if (ok)
ok = restoreState(layout_data);
if (!ok) {
QString msg = tr("Error reading %1")
.arg(fileName);
QMessageBox::warning(this, tr("Error"), msg);
return;
}
}
// ** Сохранение
void QEditorWindow::closeEvent( ... )
{
QString fileName = "settings.set";
QFile file( fileName );
if( !file.open( QFile::WriteOnly ) ) {
QString msg = "Failed to open" + fileName;
QMessageBox::warning( this, "Error", msg );
} else {
QByteArray geo_data = saveGeometry();
QByteArray layout_data = saveState();
bool ok = file.putChar( (uchar)geo_data.size() );
if( ok ) {
ok = file.write( geo_data ) == geo_data.size();
}
if( ok )
ok = file.write(layout_data) == layout_data.size();
if( !ok ) {
QString msg = "Error writing" + fileName;
QMessageBox::warning( this, "Error", msg );
}
}
}
потомучто ты на saveState() необратил внимание
void MainWindow::saveLayout()
{
QString fileName
= QFileDialog::getSaveFileName(this, tr("Save layout"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (!file.open(QFile::WriteOnly)) {
QString msg = tr("Failed to open %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, tr("Error"), msg);
return;
}
QByteArray geo_data = saveGeometry();
QByteArray layout_data = saveState();
bool ok = file.putChar((uchar)geo_data.size());
if (ok)
ok = file.write(geo_data) == geo_data.size();
if (ok)
ok = file.write(layout_data) == layout_data.size();
if (!ok) {
QString msg = tr("Error writing to %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, tr("Error"), msg);
return;
}
}
Как это не обратил? О_о Вот же он:
...
else {
QByteArray geo_data = saveGeometry();
QByteArray layout_data = saveState(); // *******
bool ok = file.putChar( (uchar)geo_data.size() );
...
да о нем, просто я прочитал строчку "через save/restore geometry" и в твой код не смотрел, т.к. голова у же не соображает, спать надо
Есть ли ещё какие-нить предложения?
Оказывается надо вызывать setObjectName для всех окошек...
не понял, а что это дает?
чтобы в файл имена объектов писались?
А хз, просто без него не работает и при сохранении Qt пишет в консоль, что имя объекта не задано...
а как нибудь можно правильно расставить при создании главного окна?
tabifyDockWidget помогло.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)