Здравствуйте!
Есть QMainWindow и множество QDockWidget, которые при запуске прячутся и показываются по мере необходимости. Набор панелек такой. При этом удобно весьма получается иногда прикрепить их к окну по краям в различных сочетаниях, на вкладках. Делается это автоматом при манипуляциях с переносом. А вот как бы иметь возможность запомнить: что и как понавешано, чтобы при следующем открытии не приходилось снова всё распихивать?
// Вот собственно две функции, которые через диалоговые окна открытия и сохранения файлов сохраняют
// лэйаут и геометрию всех виджетов. Проверено в M$ Windows и Linux .
void MainWindow::savePanels()
{
QString DirToSaveAs = QDir::homePath();
QString fileName
= QFileDialog::getSaveFileName(this, trUtf8("Сохранить расположение панелей как..."),DirToSaveAs,trUtf8( "Параметры панелей (*.pan)"));
if (fileName.isEmpty())
return;
QFile file(QString(fileName+".pan"));
if (!file.open(QFile::WriteOnly)) {
QString msg = trUtf8("Ошибка при открытии файла %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, trUtf8("Ошибка"), 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 = trUtf8("Ошибка записи в %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, trUtf8("Ошибка"), msg);
return;
}
}
void MainWindow::loadPanels()
{
QString fileName
= QFileDialog::getOpenFileName(this, trUtf8("Загрузить расположение панелей..."),("/"),trUtf8( "Параметры панелей (*.pan)"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (!file.open(QFile::ReadOnly)) {
QString msg = trUtf8("Ошибка при чтении %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, trUtf8("Ошибка"), msg);
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 = trUtf8("Ошибка при чтении %1")
.arg(fileName);
QMessageBox::warning(this, trUtf8("Ошибка"), msg);
return;
}
}
Это точно ! если не назначить имя объекта, срабатывает как-то странно . Спасибо за подсказку.
раз тема про QDockWidget есть тоже вопрос. есть много QDockWidget`s соединённых через tabifyDockWidget как можно показать определённый DockWidget?
подскажите каким образом можно сохранить QbyteArray в реестре ?
пробовал конвертитровать в String, не вышло, попробовал сделать так:
QByteArray ba = saveState();
settings.beginWriteArray("array");
for (int i = 0; i < ba.size(); ++i)
{
settings.setArrayIndex(i);
settings.setValue("index", ba.at(i));
}
settings.endArray();
QByteArray ba;
int size = settings.beginReadArray("array");
for (int i = 0; i < size; ++i)
{
settings.setArrayIndex(i);
ba.append(settings.value("index").toInt());
}
settings.endArray();
restoreState(ba);
ошибка найдена, не сохранялось в реесте, и сохранение можно сделать проще.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)