网站首页 > 技术文章 正文
前言
- 本文介绍的开机自启动方法在Windows、Linux-x86、Linux-arm、Linux-mips等平台都测试运行正常
- 首先无论是Windows还是Linux平台下想要在Qt程序中打开/关闭开机自启动,都要以管理员身份运行程序才行,Windows下就是右击程序,然后选择以管理员身份运行即可,Linux下就以sudo ./AppName命令启动程序
Windows
Windows下实现开机自启动的方式就是写入或删除注册表,用Qt实现的方法如下:
打开开机自启动:
QString appName = QApplication::applicationName();//程序名称
QString appPath = QApplication::applicationFilePath();//程序路径
appPath = appPath.replace("/","\\");
QSettings *reg = new QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QString val = reg->value(appName).toString();//如果此键不存在,则返回的是空字符串
if(val != appPath)
{
reg->setValue(appName, appPath);
}
reg->deleteLater();
关闭开机自启动:
QString appName = QApplication::applicationName();//程序名称
QSettings *reg = new QSettings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
QString val = reg->value(appName).toString();//如果此键不存在,则返回的是空字符串
if(val != "")
{
reg->remove(appName);
}
reg->deleteLater();
Linux
Linux下开机自启动有多种方法,但是本人感觉网上介绍的方法都比较繁琐,而且我也在项目中尝试了几个方法,不是达不到想要的效果就是会产生僵尸进程。本文介绍的方法是个人使用了几个Linux下开机自启动方法以后觉得最简单有效的方法,并且在项目中实际使用,效果很好。
实现原理:
Linux在开机进入桌面之后会执行/etc/xdg/autostart/文件中的脚本,这些脚本通常都是.desktop文件,.desktop相当于Windows下的桌面快捷方式但是又不全是,它还可以执行一些指定的命令,指定一些信息等。所以我们想要实现自己程序的开机自启动,就在该目录下生成一个启动自己程序的.desktop文件即可。
首先启动程序的脚本如下:
[Desktop Entry]
Name=MyAppName
Exec=home/test/MyAppName
Type=Application
Comment=MyApp Description
.desktop文件有很多的属性可以设置,但是我们简单一点的话其实写几行就完全满足需求了,还有很多其他的参数,比如启动延时、图标等,大家如果想要了解其他的参数可以在/etc/xdg/autostart/文件中,找一个已有的.desktop脚本打开就能看到。
- 第一行是标准写法,这里不做解释
- 第二行打开我们程序的名称
- 第三行就是要执行的命令,这里我们想要开机启动自己的程序,就写上程序的路径
- 第四行是类型,这里我们要启动一个程序就对应Application
- 第五行是描述,可以随便写,也可以省去这一行
知道脚本怎么写了以后,接下来我们想要在程序中实现开机自启动就比较容易了,就直接在/etc/xdg/autostart/目录下生成.desktop文件,并写入上述内容即可。要想关闭就直接删除该文件即可,注意程序一定要以管理员身份运行,否则权限不够,写文件和删除文件会失败。
打开开机自启动:
QFile file("/etc/xdg/autostart/MyAppName.desktop");
if(file.open(QIODevice::ReadWrite))
{
QTextStream stream(&file);
stream << QString("[Desktop Entry]") + "\n";
stream << QString("Name=MyAppName") + "\n";
stream << QString("Exec=") + qApp->applicationDirPath() + "/MyAppName\n";
stream << QString("Type=Application") + "\n";
stream << QString("Comment=MyApp Desription") + "\n";
file.close();
}
else
失败处理...
关闭开机自启动:
if(QFile::remove("/etc/profile.d/MyAppName.desktop"))
成功消息...
else
失败处理...
- 上一篇: c++线程间回调函数 c++多线程返回值
- 下一篇: Qt6新功能提前曝光!引入更高级别的异步API
猜你喜欢
- 2024-10-24 QT(17)- QNetworkAccessManager qnetworkinterface.allinterfaces
- 2024-10-24 Qt多线程的三种方法QThread qt多线程直接处理数据
- 2024-10-24 从零开始学Qt(86):TCP服务器端程序设计
- 2024-10-24 Qt Core学习日记——第九天QObjectData
- 2024-10-24 Qt智能指针--QSharedPointer qt智能指针.get和.data函数后计数会加吗
- 2024-10-24 QT(11)- QThread qt ui thread work thread
- 2024-10-24 Qt QVariant的用法 qt基本语法
- 2024-10-24 Qt5中QOverload的用法 qt5coredll
- 2024-10-24 Qt多线程编程之QThread qt中的多线程
- 2024-10-24 Qt QModbusReply类 qty是什么单位的缩写
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)