Вопрос

Я написал простое приложение для использования QSettings.Может кто-нибудь сказать мне, что я здесь делаю не так..

mainwindow.h

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    QWidget *pMainWidget;
    QHBoxLayout *pMainLayout;
    QSettings *pSetting;

    QLabel *pLabel;
    QPushButton *pButtonShow;
    QPushButton *pButtonSet;
    QLineEdit *pLineEdit;

    QString pSettingFile;

public slots:
    void showSettingData();
    void setData();
};

mainwindow.cpp

#include "mainwindow.h"
#include <QtCore/QCoreApplication>
#include <QApplication>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    pMainWidget = new QWidget (parent);
    pMainLayout = new QHBoxLayout(pMainWidget);

    pLabel      = new QLabel("Output comes here",pMainWidget);
    pLineEdit   = new QLineEdit();
    pButtonShow = new QPushButton("Show", pMainWidget);
    pButtonSet  = new QPushButton("Set", pMainWidget);

    setCentralWidget(pMainWidget);
    pMainWidget->setLayout(pMainLayout);
    pMainLayout->addWidget(pLabel);
    pMainLayout->addWidget(pButtonShow);
    pMainLayout->addWidget(pLineEdit);
    pMainLayout->addWidget(pButtonSet);

    pSettingFile = QApplication::applicationDirPath()+"settings.ini";

    QObject::connect(pButtonShow, SIGNAL(clicked()), this, SLOT(showSettingData()));
    QObject::connect(pButtonSet, SIGNAL(clicked()), this, SLOT(setData()));

}

MainWindow::~MainWindow()
{

}

void MainWindow::setData()
{
    QSettings Setting(pSettingFile, QSettings::NativeFormat);

    QString data = pLineEdit->text();
    Setting.setValue("baseurl", data);
}

void MainWindow::showSettingData()
{
    QSettings Setting(pSettingFile, QSettings::NativeFormat);

    if (Setting.contains("baseurl"))
    {
        QString data = Setting.value("baseurl").toString();
        pLabel->setText(data);
    }

}

main.cpp

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

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

    return a.exec();
}

Когда я отлаживаю, он не возвращает false для "Setting.contains("baseurl")"...Нужно ли нам создавать файл настроек?

Это было полезно?

Решение

Проблема в том, что вы не вызываете синхронизацию после установки данных.Попробуйте вставить эту строку после настройки:

Setting.setValue("baseurl", data);
Setting.sync();

Это не должно быть необходимо в Windows, но, похоже, это необходимо в Windows.

Кроме того, как предложено в комментариях, я бы предложил использовать QSettings::IniFormat вместо QSettings::NativeFormat если вы действительно хотите использовать файлы, а не потенциально реестр в Windows.

Вам также следует рассмотреть возможность создания объекта настроек как члена класса, а не создавать его постоянно.

Также обратите внимание, что вы можете случайно использовать неправильный путь, поскольку вам придется явно добавить символ косой черты перед именем файла «settings.ini».Однако это всего лишь примечание.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top