我为linux写了一个qt应用程序。 应用程序应该在启动时运行 – 我使用的是桌面条目。
但我需要它更复杂:有一个checkbox,用户应该检查,以select应用程序是否将在启动时运行。
我想如何保存他的预设?
之前的应用程序是wriiten窗口,这是保存在registry中。 我从谷歌search,我应该保存在/ etc。
应该是什么文件? 我怎么写我的代码? 我可以添加一个条件的桌面条目,或者我应该运行一些脚本?
所有这些我都很新,所以我会详细解答一下。
谢谢你。
对于这种特殊情况,保存一个首选项设置来控制应用程序是否应该在启动时运行,这是毫无意义的。 自动运行条目桌面文件的存在反映了该偏好的状态。 如果该文件存在,则选中该复选框。 如果用户取消选中复选框,则删除该文件。 如果用户选中复选框,则创建该文件。 而已。 在偏好存储中复制设置只会导致错误,因为现在必须保持文件系统中的文件设置和存在状态同步,并且必须处理各种各样的情况。
另外,请记住/etc/xdg/autostart
是系统范围的自动运行条目。 如果它应该是每个用户的设置,则应该在用户的自动启动目录中创建.desktop文件。 要确定它的位置,请遵循桌面应用程序自动启动规范 ,该规范要求位置为$XDG_CONFIG_DIRS/autostart
,通常会解析为用户家中的.config/autostart
目录(但是,如果存在XDG_CONFIG_DIRS
环境变量,则应该通过先读取这个值然后追加/autostart
来解决它。)
这是一个打印出你想要的东西的例子程序:
#include <cstdlib> #include <iostream> #include <QtCore/QString> #include <QtCore/QDir> #ifndef Q_OS_UNIX #error This method only makes sense on Unix, use OS-specific handling for other OSes. #endif QString getUserXdgConfigDir() { QString result(std::getenv("XDG_CONFIG_DIRS")); if (result.isEmpty()) { // XDG_CONFIG_DIRS is not defined, we'll use the default value // as mandated by http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html result = QDir::homePath() + QDir::separator() + ".config"; } return result; } QString getUserAutostartDir() { return getUserXdgConfigDir() + QDir::separator() + "autostart"; } int main(int argc, char *argv[]) { std::cout << "User config dir is " << getUserXdgConfigDir().toStdString() << std::endl; std::cout << "User autostart dir is " << getUserAutostartDir().toStdString() << std::endl; return 0; }
我的解决方案如下。 写入用户的首选项,以启动登录在sat $ HOME / .config / myapp.pref(.config防止点文件蠕变)的文件中。 然后,让你的应用程序的自动调用桌面项添加一个命令行开关(例如,调用myapp -a而不是myapp)。
然后,在你的程序中, 如果交换机-a存在,检查你的点文件,看看用户是否要自动启动。 如果答案是肯定的,则正常运行。 如果用户不想自动启动,请退出程序。 此外,请在将应用程序的任何用户可见部分放置之前进行此开关和点文件检查。
为了保存设置,请使用QSettings类。 它真的很整洁,并在Windows上将它的值存储在注册表中,所以很可能它将与您已经使用的注册表项兼容。
/ ect用于系统设置。
通过启动你的意思是登录或系统启动?
在linux下为用户保存单个(!)用户配置的最简单的方法是在其主目录下使用设置(在linux中在文件名的前面加“。”使其成为隐藏文件) 。
我认为现在稍微适合的方法是将一个非隐藏的文件放在一个文件夹下,并在应用程序名下放置在config目录下。 即检查$ XDG_CONFIG_HOME是否设置,如果它是一个以你的应用程序名称命名的文件夹,在你的配置文件下面,否则将该文件夹放在$ HOME / .config下面。 请参阅http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
PS通常在应用程序开始时手动读取设置文件(仅在解析命令行参数之后)。
请注意,这是“简单”的方式,Qt似乎有一个跨平台的方式处理简单的字典样式设置类 ,这可能是你想要的。 或者你可以检查你是否设置了启动和撤消/做(切换)。