Q设置对我来说效果不佳

QSetting doesn't works fine for me

本文关键字:设置 对我来说      更新时间:2023-10-16

我编写了一个使用QSettings的简单应用程序。有人能告诉我我在这里做错了什么吗。。

主窗口.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();
};

主窗口.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();
}

当我调试时,它不会为"Setting.contations("baseurl")"返回false…我们必须创建设置文件吗?

问题是设置数据后没有调用sync。尝试在设置后插入此行:

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

这在Windows上不应该需要,但在Windows上似乎是必要的。

此外,正如评论中所建议的,如果您真的想在Windows上使用文件而不是潜在的注册表,我建议使用QSettings::IniFormat而不是QSettings::NativeFormat

您还应该考虑将settings对象作为类成员,而不是一直构造它。

此外,请注意,您可能无意中使用了错误的路径,因为您必须在"settings.ini"文件名之前明确添加"斜杠"字符。然而,这只是一个旁注。