QSetting 不适合我

Posted

技术标签:

【中文标题】QSetting 不适合我【英文标题】:QSetting doesn't works fine for me 【发布时间】:2014-04-12 06:50:20 【问题描述】:

我编写了一个简单的应用程序来使用 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.contains("baseurl")”返回false...我们必须创建设置文件吗?

【问题讨论】:

请把您的问题限制在一个问题上。这个网站的原则是一个好问题和一个好答案。另外,你能提供一个简单的SSCCE 例子吗?目前,您指的是设置问题,但您这里似乎有一些UI代码,没有main函数,项目文件等。您也没有解释您是如何使用UI的。 @Laszlo 编辑了问题 如上所述,您如何使用 UI?你能解释一下吗?首先,您尝试使用设置然后显示按钮?您的意思是,您首先使用的是显示按钮,并且您希望 contains 返回 false,但它在没有先按 set 按钮的情况下返回 true? 是的。我在行编辑中输入数据,点击设置按钮,然后显示按钮 您是否尝试过 QSettings::IniFormat 而不是 QSettings::NativeFormat?本机意味着 Windows 上的注册表,这可能会导致问题。你用的是哪个操作系统,安卓?就此而言,Qt 4 是哪个 Qt 版本? 【参考方案1】:

问题是您在设置数据后没有调用同步。尝试在设置后插入这一行:

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

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

另外,正如 cmets 中所建议的,如果您真的想在 Windows 上使用文件而不是可能的注册表,我建议使用 QSettings::IniFormat 而不是 QSettings::NativeFormat

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

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

【讨论】:

好的..我检查一下并标记为答案...还有一点,如果答案中有一点,我们不应该给出-1,对吗? @Abin:为什么?您还确认自己不能解决问题。虽然这是一个有用的评论,但它只是一个评论,所以它应该是评论或在真实答案末尾的附注,作为附加说明恕我直言。就像我对你的回答所做的那样,我什至可能会把它作为评论投赞成票。 我试过了。但是没有用,它没有创建文件。但是 QSettings::IniFormat 将起作用,并且这也会创建将存储数据的文件。

以上是关于QSetting 不适合我的主要内容,如果未能解决你的问题,请参考以下文章

从配置文件 qsetting 中删除键/值对

用于 QList 的 QSetting<数据类型>

QSetting 说明和简单使用

如何设置Qt中的build settings

QSetting

text QSetting示例ui