The QT provides an adorable way to store the settings of a program with a GUI (and not only) by means of the QSettings library. Below, we quote a personal version of the project ‘parkman‘ (Parking Manager).

In this application, two methods were used (one for the safe reading of settings and one for storing settings). I mention “safe reading” because the reading method also performs control over the data and the configuration settings file (if there is any problem, it then creates a configuration file with default values).

Methods for reading and writing program settings:

...
/* write the settings of the program. */
void
SettingsForm::writeSettings() {
    QSettings s(setsAppOrg, setsAppName);

    s.beginGroup("parking");
    s.setValue("capacity", parkingCapacitySpin->value());
    s.endGroup();

    s.beginGroup("payment");
    s.setValue("timeslice", chargeTimesliceSpin->value());
    s.setValue("charge_precision", chargePrecisionSpin->value());
    s.endGroup();

    /* try to write down the settings. */
    s.sync();

    /* if the app cannot write the settings. */
    if (s.status() != QSettings::NoError) {
        /* show a message. */
        QMessageBox::critical(this, infoMsgTitleStr, cantWriteSetsStr);

        /* terminate the program. */
        exit(EXIT_FAILURE);
    }
}

/* establish the settings of the program.
   also check, create them if not exist. */
void
SettingsForm::establishSettings() {
    QSettings s(setsAppOrg, setsAppName);

    s.beginGroup("parking");
    if (s.value("capacity").isNull()
        || s.value("capacity").toInt() < MIN_PARKING_CAPACITY
        || s.value("capacity").toInt() > MAX_PARKING_CAPACITY) {
        s.setValue("capacity", DEF_PARKING_CAPACITY);
    } else {
        sets.parkingCapacity = s.value("capacity").toInt();
    }
    s.endGroup();

    s.beginGroup("payment");
    if (s.value("timeslice").isNull()
        || s.value("timeslice").toInt() < MIN_TIMESLICE
        || s.value("timeslice").toInt() > MAX_TIMESLICE) {
        s.setValue("timeslice", DEF_TIMESLICE);
    } else {
        sets.timeslice = s.value("timeslice").toInt();
    }

    if (s.value("charge_precision").isNull()
        || s.value("charge_precision").toInt() < MIN_CHARGE_PRECISION
        || s.value("charge_precision").toInt() > MAX_CHARGE_PRECISION) {
        s.setValue("charge_precision", DEF_CHARGE_PRECISION);
    } else {
        sets.chargePrecision = s.value("charge_precision").toInt();
    }
    s.endGroup();

    /* try to write down the settings. */
    s.sync();

    /* if the app cannot write the settings. */
    if (s.status() != QSettings::NoError) {
        /* show a message. */
        QMessageBox::critical(this, infoMsgTitleStr, cantWriteSetsStr);

        /* terminate the program. */
        exit(EXIT_FAILURE);
    }
}
...