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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сохранить размеры формы на выходе из программы?  (Прочитано 5065 раз)
Dr.Vlad
Гость
« : Апрель 13, 2010, 22:02 »

Здравствуйте.
Как мне сохранить размеры формы на выходе из программы, если у меня на ней три фрейма с TableView и два сплиттера между ними.
Премного благодарен.
Записан
Karl-Philipp
Гость
« Ответ #1 : Апрель 13, 2010, 22:39 »

QSettings?

p.s. Как вопрос относится к базам даных?
Записан
voronElf
Гость
« Ответ #2 : Апрель 14, 2010, 07:28 »

код выдернул из своей проги для сплиттеров и окошек,  CSettings унаследован от QSettings
Код:
bool CSettings::saveSplitterSizes(QSplitter * split, const QString & key, const QString & prefix) {
    QList<int> sizes = split->sizes();
    QString data;
    for(int i=0; i<sizes.size(); i++) {
        if(i>0) data += "*";
        data += QString::number( sizes.at(i) );
    }//for
    if(prefix.isEmpty()) setValue(key, data);
    else setValue(prefix + "/" + key, data);
    return true;
}

bool CSettings::setSplitterSizes(QSplitter * split, const QString & key, const QString & prefix) {
    QString data;
    if(prefix.isEmpty()) data = key; else data = prefix + "/" + key;
    data = value(data, QVariant()).toString();
    if(data.isEmpty()) return false;
    QStringList list = data.split(QChar('*'), QString::SkipEmptyParts);
    QList<int> sizes;
    bool ok = false;
    for(int i=0; i<list.size(); i++) {
        sizes << list.at(i).toInt(&ok);
        if(!ok) return false;
    }//for
    split->setSizes( sizes );
    return true;
}

bool CSettings::saveGuiStateWindow(QWidget * wnd, const QString & key, const QString & prefix) {
    QString path;
    if(prefix.isEmpty()) path = key; else path = prefix +"/"+ key;
    setValue(path + "_state", (int)wnd->windowState());
    if(!(wnd->windowState() & Qt::WindowMaximized)) setValue(path + "_geometry", wnd->geometry());
    return true;
}

bool CSettings::setGuiStateWindow(QWidget * wnd, const QString & key, const QString & prefix) {
    QString path;
    if(prefix.isEmpty()) path = key; else path = prefix +"/"+ key;

    QRect geometry = value(path + "_geometry", wnd->geometry()).toRect();
    if(geometry.isValid()) wnd->setGeometry(geometry);

    int state = value(path + "_state", Qt::WindowMaximized).toInt();
    if(state & Qt::WindowMaximized) wnd->setWindowState(Qt::WindowMaximized);
    else wnd->setWindowState(Qt::WindowNoState);
    return true;
}

« Последнее редактирование: Апрель 14, 2010, 15:42 от voronElf » Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Апрель 14, 2010, 07:57 »

Вот ещё пример, точно сказать как он у тебя отработает не могу, но у меня в софтине от сохраняет и загружает виджеты на форме в том порядке и с тем размером в котором их оставил юзверь
Код:
void MainWindow::saveLayout()
{
    QFile file(QCoreApplication::applicationDirPath()+"/settings.set");
    if (!file.open(QFile::WriteOnly)) {
        QString msg = tr("Failed to open %1\n%2")
                        .arg("settings.set")
                        .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("settings.set")
                        .arg(file.errorString());
        QMessageBox::warning(this, tr("Error"), msg);
        return;
    }
}

void MainWindow::loadLayout()
{
    QFile file(QCoreApplication::applicationDirPath()+"/settings.set");
    if (!file.open(QFile::ReadOnly)) {
        QString msg = tr("Failed to open %1\n%2")
                        .arg("settings.set")
                        .arg(file.errorString());
        QMessageBox::warning(this, tr("Error"), 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 = tr("Error reading %1")
                        .arg("settings.set");
        QMessageBox::warning(this, tr("Error"), msg);
        return;
    }
}
Записан
alexman
Гость
« Ответ #4 : Апрель 14, 2010, 08:18 »

ПС: break и niXman наверно опустят этот код ниже плинтуса, если не лень будет писать )))
А что в этом плохого? Если реально код плох почему бы не узнать все свои ошибки? Наоборот хорошо когда есть [оправданная] критика! Есть к чему стремиться Улыбающийся
Записан
Kolobok
Гость
« Ответ #5 : Апрель 14, 2010, 11:05 »

код выдернул из своей проги для сплиттеров

У QSplitter есть методы сохранения/восстановления состояния

Код:
bool restoreState ( const QByteArray & state )
QByteArray saveState () const
Записан
voronElf
Гость
« Ответ #6 : Апрель 14, 2010, 12:01 »

ПС: break и niXman наверно опустят этот код ниже плинтуса, если не лень будет писать )))
А что в этом плохого? Если реально код плох почему бы не узнать все свои ошибки? Наоборот хорошо когда есть [оправданная] критика! Есть к чему стремиться Улыбающийся

а я и не говорю что это плохо, даже наоборот, интересно было бы услышать (т.е. прочитать )

Цитировать
У QSplitter есть методы сохранения/восстановления состояния
а проверял как они работают ?
я попытался (давно уже), закосячилось все, плюнул и написал сам
Записан
Kolobok
Гость
« Ответ #7 : Апрель 14, 2010, 12:39 »

а проверял как они работают ?

Проверял. Работают.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Апрель 14, 2010, 16:22 »

Работают отлично.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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