Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Dr.Vlad от Апрель 13, 2010, 22:02



Название: Как сохранить размеры формы на выходе из программы?
Отправлено: Dr.Vlad от Апрель 13, 2010, 22:02
Здравствуйте.
Как мне сохранить размеры формы на выходе из программы, если у меня на ней три фрейма с TableView и два сплиттера между ними.
Премного благодарен.


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: Karl-Philipp от Апрель 13, 2010, 22:39
QSettings?

p.s. Как вопрос относится к базам даных?


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: voronElf от Апрель 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;
}



Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: ecspertiza от Апрель 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;
    }
}


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: alexman от Апрель 14, 2010, 08:18
ПС: break и niXman наверно опустят этот код ниже плинтуса, если не лень будет писать )))
А что в этом плохого? Если реально код плох почему бы не узнать все свои ошибки? Наоборот хорошо когда есть [оправданная] критика! Есть к чему стремиться :)


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: Kolobok от Апрель 14, 2010, 11:05
код выдернул из своей проги для сплиттеров

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

Код:
bool restoreState ( const QByteArray & state )
QByteArray saveState () const


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: voronElf от Апрель 14, 2010, 12:01
ПС: break и niXman наверно опустят этот код ниже плинтуса, если не лень будет писать )))
А что в этом плохого? Если реально код плох почему бы не узнать все свои ошибки? Наоборот хорошо когда есть [оправданная] критика! Есть к чему стремиться :)

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

Цитировать
У QSplitter есть методы сохранения/восстановления состояния
а проверял как они работают ?
я попытался (давно уже), закосячилось все, плюнул и написал сам


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: Kolobok от Апрель 14, 2010, 12:39
а проверял как они работают ?

Проверял. Работают.


Название: Re: Как сохранить размеры формы на выходе из программы?
Отправлено: Пантер от Апрель 14, 2010, 16:22
Работают отлично.