QSettings持久性在初次启动时不断写入配置文件

时间:2019-01-29 21:56:45

标签: qt

所以我有一个在Linux上运行的qt应用程序。最初启动应用程序时,即使未对QSettings进行任何更改,QSettings仍会不断写入settings.conf文件。一旦用户更改了任何设置,它就会停止写入并像正常情况一样工作,并且仅在更改期间写入。我们的硬件没有电源按钮,因此永远不会关闭,并且会不断插入,因此在启动时让QSettings不断写入.conf文件是一个问题。

我在寻找计时器,以确保没有计时器提示要写并且没有计时器。尝试了settings.sync()。我什至在启动时设置了一个一次性的值,因为在首次启动后在应用程序中更改了一个值后,它会停止写入,但这没有用。所有设置持久性都是以这种方式编写的,在我将代码底部的 settings.setValue 注释掉之后,.conf写入过程将按预期进行。我不知道为什么通过单击电源按钮设置值时会写。有什么想法吗?

代码和流程如下:

void MainWindow::onNavBarButtonClicked(int buttonClickedIdAsInt)
{
//..... 
case NavBarButton::POWER:
        activeScreenContainer->setCurrentWidget(userScreen);
        activeScreenContainer ->raise();
        navBarFrame->raise();
        navBarActiveContainerSeparator->hide();
        logoUserScreen->show();
        logoUserScreen->raise();
        if(orientationSelected == appPersistence::PORTRAIT_ORIENTATION_VALUE) {
            timeAndUserFrame->hide();
        }

        emit userLoggedOut(); 
} 

connect(this, &MainWindow::userLoggedOut, musicScreenModel,
&MusicScreenModel::onUserLoggedOut);

void MusicScreenModel::onUserLoggedOut()
{
    emit userLoggedOutTreble(currentTrebleValue);
}

connect(musicScreenModel, &MusicScreenModel::userLoggedOutTreble,
settingsScreenModel, &SettingsScreenModel::onUserLoggedOutTreble);

void SettingsScreenModel::onUserLoggedOutTreble(int trebleToStore)
{
    settings.setValue(appPersistence::MUSIC_TREBLE_KEY + loggedInUser,
    trebleToStore);
}

主要:

int main(int argc, char *argv[])
{ 
    QApplication a(argc, argv);

    QCoreApplication::setOrganizationName("Organization");
    QCoreApplication::setApplicationName("AppName");
    QSettings::setPath(QSettings::Format::NativeFormat,QSettings::Scope::UserScope, "/opt/");

QSettings settings;

int fontFamilyId = QFontDatabase::addApplicationFont(":/fonts/Quicksand-Bold.ttf");
settings.setValue(fontStyle::QUICKSAND_BOLD_FAMILY_ID, fontFamilyId);

if(!settings.value(appPersistence::ORIENTATION_SELECTED_KEY).isValid()) {
    settings.setValue(appPersistence::ORIENTATION_SELECTED_KEY, appPersistence::LANDSCAPE_ORIENTATION_VALUE);
}

if(true) {
    DevOnlyFunctions::seedRng();
}

testBuild::setIsTestBuild(false);

MainWindow w;
w.show();

return a.exec();
}

1 个答案:

答案 0 :(得分:0)

所以我终于弄清楚了问题出在哪里。我们有一个计时器,用于显示是否存在某些Can Bus设备。如果它们不存在,我们将隐藏图标并通过调用onUserLoggedOut()方法而不是通过connect语句直接注销用户。我一直在寻找计时器和connect语句,而不是嵌套在使用计时器的开关内的直接方法调用。