Сохранить настройки приложения qt с помощью QSettings

Здравствуйте, я создал приложение с помощью qt, и мне удалось сохранить некоторые его настройки с помощью QSettings.

void DoneIt::writeSettings()
{
    QSettings settings("mycompany", "RightDoneIt");
    settings.beginGroup("DoneIt");
    settings.setValue("size", size());
    settings.setValue("pos", pos());
    settings.endGroup();
}

void DoneIt::readSettings()
{
    QSettings settings("mycompany", "RightDoneIt");
    settings.beginGroup("DoneIT");
    resize(settings.value("size", QSize(400, 400)).toSize());
    move(settings.value("pos", QPoint(200, 200)).toPoint());
    settings.endGroup();
}

Это прекрасно работает с положением и размером окна. Я добавил некоторые виджеты в свое приложение, используя конструктор qt, и я также хотел бы сохранить их состояние.

Один из моих виджетов — это переключатель, и я называю его radioButtonbnw.

Как я могу сохранить его состояние (проверено или не проверено)?

Каковы лучшие практики?


person Sharethefun    schedule 17.11.2010    source источник


Ответы (2)


  1. Поместите их в QButtonGroup.
  2. Используйте QButtonGroup::setId, чтобы установить идентификатор для каждого переключателя в этой группе.
  3. Сохраните идентификатор отмеченной кнопки, получив QButtonGroup::checkedId.
  4. Получите указатель этой кнопки, используя QButtonGroup::button(id) при восстановлении, и вызовите QAbstractButton::setChecked.

Кстати: если вы хотите сохранить текущее состояние панелей инструментов и док-виджетов главного окна, используйте QMainWindow::saveState.

person Community    schedule 17.11.2010
comment
Пожалуйста, не могли бы вы быть немного более точным? это мой первый раз, когда я имею дело с QbuttonGroup. Можете ли вы предоставить мне код? 1000 благодарностей - person Sharethefun; 17.11.2010
comment
Извините, что я занят своим проектом и не имею существующего кода. - person Mason Zhang; 23.11.2010
comment
Нет проблем :) вот ваши голоса и баллы :) удачи в вашем проекте - person Sharethefun; 09.12.2010

Вот пример виджета с тремя QRadioButton

settingspane.h

#ifndef SETTINGSPANE_H
#define SETTINGSPANE_H

#include <QWidget>
#include <QSettings>

class SettingsPane
      : public QWidget
{
    Q_OBJECT

    QSettings *settings;

public:
    explicit SettingsPane(QWidget *parent = nullptr);

public slots:
    void handle_rb_buttonReleased(int id);
};

#endif // SETTINGSPANE_H

settingspane.cpp

#include "settingspane.h"

#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QRadioButton>
#include <QButtonGroup>

SettingsPane::SettingsPane(QWidget *parent)
   : QWidget(parent)
{
    settings = new QSettings();

    auto mlayout = new QVBoxLayout();
    setLayout(mlayout);

    // create some buttons
    auto rb_frst = new QRadioButton("first");
    auto rb_scnd = new QRadioButton("second");
    auto rb_thrd = new QRadioButton("third");
    // container to organize groups of buttons (no visual)
    auto buttonGroup = new QButtonGroup();
    buttonGroup->addButton(rb_frst,0);
    buttonGroup->addButton(rb_scnd,1);
    buttonGroup->addButton(rb_thrd,2);
    // layout buttons for visual representation
    auto rb_layout = new QHBoxLayout();
    rb_layout->addWidget(rb_frst);
    rb_layout->addWidget(rb_scnd);
    rb_layout->addWidget(rb_thrd);
    mlayout->addLayout(rb_layout);

    // use Functor-Based Connection due to overloaded buttonReleased
    connect( buttonGroup,
             SIGNAL(buttonReleased(int)),
             this,
             SLOT(handle_rb_buttonReleased(int)));

    // restore button from settings
    int id = settings->value("buttonGroup").toInt();
    buttonGroup->button(id)->setChecked(true);
}

void
SettingsPane::handle_rb_buttonReleased(int id)
{
    // save new status to the settings
    settings->setValue("buttonGroup", id);
}

Использование этого в MainWindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow
      : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "settingspane.h"

#include <QTabWidget>

MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
    auto cwidget = new QTabWidget();
    setCentralWidget(cwidget);

    auto settingsPane = new SettingsPane();
    cwidget->addTab(settingsPane,"Settings");
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

приводит к:
введите здесь описание изображения

person Alex44    schedule 23.03.2018