linux下实现Qt程序实现开机自启动

1.原理

要想实现开机自启动,首先,QT是没有这种实现的,最好是靠电脑开机的启动目录启动软件,下面这个目录

/etc/xdg/autostart

这是操作系统中用于配置启动项的目录,该目录下存放着开机自启动的启动器(.desktop)文件,要想软件开机自启动,大都是通过配置一个启动器文件来实现,可以看一下这个目录

里面存放着很多开机要启动的配置

所以我们写的QT 程序要想实现自启动,为这个程序写一个启动器(.desktop)文件放在这个目录下即可

2.实现

那么怎么实现呢?

其实不难,就几行代码,如下所示

[Desktop Entry]
Exec=/home/yicaobao/qtProjects/SelfStartDemo/bin/bin/SelfStartDemo
Icon=/home/yicaobao/qtProjects/SelfStartDemo/bin/resource/start-logo.png
Name=SelfStartDemo
Terminal=false
Type=Application
X-Deepin-Vendor=user-custom

简单介绍一下主要的:

1.Exec:要运行的东西(程序,脚本等)路径

2.Name:desktop文件的名字,在/etc/xdg/autostart目录下显示的启动器名字

3.Type: 用于指定 desktop 文件的类型(包括 3 种类型:Application、Link、Directory)。

4.Icon: desktop 文件没有图标

        Icon: 指定应用程序图标的完整路径(可以省略后缀名)。

        图标支持 png 格式、svg 格式等,图标的推荐尺寸为 128x128。

因此一个基本的 desktop 文件模板应该像下面这样:

[Desktop Entry]

Name=<应用程序名>

Type=Application

Exec=<应用程序完整路径>

Icon=<应用程序图标的完整路径>

我从这里引用过来的:https://www.ywnz.com/linuxjc/3603.html,要了解跟多可以去看一下

所以我们只要写一个启动器,丢到启动目录就行了

其实也不算麻烦,但是并不是很方便,但是想要智能一点,在程序里写一个可选项,勾选就可以实现开机自启动或者取消开机自启动就更好了,像这样

3.QT代码实现

思路如下,先写一个启动器,然后在写开机自启动和取消开机自启动脚本程序,脚本程序将启动器拷贝到linux启动目录就可以了

所以QT里就用到了,文件写入,执行脚本的模块

解释一下核心代码:

1.获取当前程序的名字,因为启动需要

AppName = QCoreApplication::applicationName();

2.启动脚本目录

    QDir dir(QCoreApplication::applicationDirPath());dir.cdUp();startFileDir =  dir.path();

3.生成启动器的代码

void Widget::generateStartFile(QString fileName)
{QString filePath =  startFileDir + "/" + fileName;QFile File(filePath);if(File.exists()) {//return;}QString startFilePath;QStringList list;list << "[Desktop Entry]"<< QString("Exec=%1/bin/%2").arg(startFileDir).arg(AppName)<< QString("Icon=%1/resource/start-logo.png").arg(startFileDir)<< QString("Name=%1").arg(AppName)<< "Terminal=false"<< "Type=Application"<< "X-Deepin-Vendor=user-custom";//写入到文件中writeStartFile(filePath, list);
}

4.生成拷贝启动器文件到linux下启动目录的shell脚本

void Widget::copyToAutostartShell(QString desktopName)
{QStringList arguments;arguments << "#!/bin/sh"<< QString("#设置开机自动启动")<< QString("echo \"%1\" | sudo -S cp %2 /etc/xdg/autostart").arg(userPwd).arg(startFileDir+'/'+desktopName)<< QString("notify-send \"程序已设置开机自启动\"");//写入到文件中writeStartFile(startFileDir+"/AotuStart.sh", arguments);
}

5.生成移除启动器文件的脚本,也就是取消开机启动

void Widget::removeAutostartFile(QString desktopName)
{QStringList arguments;arguments << "#!/bin/sh"<< QString("echo \"%1\" | sudo -S rm /etc/xdg/autostart/%2").arg(userPwd).arg(desktopName)<< QString("notify-send \"程序开机自启动已取消\"");writeStartFile(startFileDir+"/unAotuStart.sh", arguments);
}

6.执行脚本的代码

void Widget::executeLinuxCmd(QString path, QString fileName)
{QProcess *backupProcess = new QProcess;backupProcess->setWorkingDirectory(path);backupProcess->start("/bin/sh",QStringList()<<fileName);bool isfinished = backupProcess->waitForFinished();QString strResult = backupProcess->readAllStandardOutput();QString strErrResult = backupProcess->readAllStandardError();//QStringList strList = strResult.split("\n");if(!strErrResult.isEmpty()) {QMessageBox::information(this, "提示", strResult);}else {QMessageBox::information(this, "提示", strResult);}if(isfinished){backupProcess->close();delete backupProcess;backupProcess = nullptr;}
}

点击选中开机自启动或者取消开机自启动的代码

void Widget::on_selfStart_stateChanged(int state)
{Q_UNUSED(state)UserPwdDialog dialog(this);if (QDialog::Accepted != dialog.exec())return;userPwd = dialog.getPWD();if(ui->selfStart->isChecked()) {generateStartFile(QString("%1.desktop").arg(AppName));copyToAutostartShell(QString("%1.desktop").arg(AppName));executeLinuxCmd(startFileDir, "AotuStart.sh");}else {removeAutostartFile(QString("%1.desktop").arg(AppName));executeLinuxCmd(startFileDir, "unAotuStart.sh");}
}

4. 效果

设置开机自启动后效果如下,重启电脑就会发现程序会开机启动了

设置取消开机自启动后效果如下,把启动器文件删除了,就不会开机启动了

我只是举一个简单的例子,可以根据这个例子,理解了,做成一个接口,到时,就可以给想要做开机自启动的程序用了

我给一下这个例子的源代码:

链接: https://pan.baidu.com/s/1Yn_N87IKgjKUerVhb5GtUQ 提取码: 8888 

linux下的QT程序开机自启动,用代码实现智能化开启或取消,找了很久在网上都没有找到一个,૮₍ ◞‸◟₎ა ,后面就自己找了个时间了解这个原理后,弄了一个例子出来,对你有帮助的,记得点个赞,让我看看是不是有很多人想要这种功能性的代码

或者你们有什么更好的方案或者其他问题的,评论取留言探讨一下੭ ᐕ)੭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink-时间流与水印

时间流与水印 一、背景二、时间语义1.事件时间&#xff08;event time&#xff09;2.读取时间&#xff08;ingestion time&#xff09;3.处理时间&#xff08;processing time&#xff09; 三、水印-Watermarks1.延迟和正确性2.延迟事件3.顺序流4.无序流5.并行流 四、Windows1.…

28 主题管理

1.如何删除主题 执行kafka-topics脚本&#xff0c;删除操作是异步的&#xff0c;执行完脚本只是把主题标记为已删除 2.删除主题失败 可能原因&#xff1a; 副本所在broker宕机了待删除主题的部分分区还在迁移 解决方法&#xff1a; 手动删除zk节点/admin/delete_topics下以…

初识Java 18-5 泛型

目录 动态类型安全 异常 混型 C中的混型 替代方案 与接口混合 使用装饰器模式 与动态代理混合 本笔记参考自&#xff1a; 《On Java 中文版》 动态类型安全 在Java 5引入泛型前&#xff0c;老版本的Java程序中就已经存在了List等原生集合类型。这意味着&#xff0c;我们…

【计算机网络笔记】交换机

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【MySQL工具】my2sql-快速解析binlog

​​​​​​ 目录 ​​​​​​安装 my2sql简介 用途 工具优势 限制 账号所需权限 参数解析 场景 场景1 回滚 安装 安装比较简单 直接下载二进制命令即可使用 wget https://github.com/liuhr/my2sql/raw/master/releases/centOS_release_7.x/my2sql my2sql简介 …

AUTOSAR系统服务篇 - BswM

文章目录 模式仲裁仲裁规则模式条件和逻辑表达式模式仲裁的要求立即操作和延时操作初始化后的仲裁行为模式控制模式处理周期模式控制的要求触发和条件动作列表可用动作初始化后的模式控制行为等待功能多分区支持BswM接口和端口模式请求端口模式切换端口模式切换通知组件类型和内…

上海亚商投顾:沪指震荡下跌 成交量继续下破8000亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指、创业板指午后跌超1%&#xff0c;北证50指数跌超7%&#xff0c;超百只北…

Windows11编译Hadoop3.3.6源码

由于https://github.com/kontext-tech/winutils还未发布3.3.6版本&#xff0c;因此尝试源码编译 目录 环境和安装包准备&#xff0c;见2zlib编译方法一&#xff1a;方法二&#xff1a; 配置文件更改1. maven阿里云镜像2. Node版本3. 越过Javadoc检查 编译HadoopError,其他报错…

JavaScript中的异步处理方法

JavaScript中的异步处理是开发者在日常开发过程中必须面对的一个重要问题。由于JavaScript是单线程的&#xff0c;因此对于一些可能需要长时间执行的操作&#xff0c;如网络请求、IO操作等&#xff0c;如果采用同步的方式&#xff0c;可能会导致应用程序的阻塞&#xff0c;降低…

科研学习|论文解读——Deep learning for anomaly detection in log data: a survey

摘要 自动日志文件分析能够及早发现系统故障等相关事件。特别是&#xff0c;自学习异常检测技术能够捕捉日志数据中的模式&#xff0c;然后向系统操作员报告意外的日志发生&#xff0c;而无需提前提供或手动建模异常场景。最近&#xff0c;越来越多的利用深度学习方法来实现此目…

【Java】JDBC 之 PreparedStatement 和 Statement 的区别和理解【转载并梳理】

一、PreparedStatement 和 Statement 的含义和区别 1、含义 PreparedStatement&#xff1a;PreparedStatement 是预编译的&#xff0c;对于批量处理可以大大提高效率&#xff0c;也叫 JDBC存储过程。Statement&#xff1a;使用 Statement 对象&#xff0c;在对数据库只执行一…

ExoPlayer - Failed to initialize OMX.qcom.video.decoder.avc

人莫鉴于流水而鉴于止水&#xff0c;唯止能止众止 1. 背景 使用ExoPlayer&#xff0c;我不信你没遇到过这个问题&#xff1a; java.lang.IllegalArgumentException: Failed to initialize OMX.qcom.video.decoder.avc 详细内容如下图所示&#xff1a; 2. MediaCodec(解码器) …

ArkUI框架中的PersistentStorage和Environment深入详解【鸿蒙专栏-13】

文章目录 ArkUI框架中的PersistentStorage和EnvironmentPersistentStorage:保持状态的长存储概述限制条件使用场景初始化和访问属性示例流程图注意事项Environment:设备环境查询使用场景从UI中访问Environment参数应用逻辑使用Environment深入ArkUI框架的持久化存储与设备环境…

FastApi接收不到Apifox发送的from-data字符串_解决方法

接收不到Apifox发送的from-data字符串_解决方法 问题描述解决方法弯路总结弯路描述纵观全局小结 问题描述 这里写了一个接口&#xff0c;功能是上传文件&#xff0c;接口参数是file文件和一个id字符串 gpt_router.post("/uploadfiles") async def create_upload_fi…

使用Feign简化Spring Boot微服务间的调用

摘要&#xff1a; 在微服务架构中&#xff0c;服务间的通信是至关重要的。Spring Cloud提供了多种工具&#xff0c;其中Feign是一款声明式的Web服务客户端&#xff0c;能够显著简化服务调用的过程。本文将详细介绍在Spring Boot应用中如何使用Feign进行微服务之间的调用。 正文…

配置自动化部署Jenkins和Gitea

配置自动化部署 这里使用的是JenkinsGitea 如果不知道怎么安装Jenkins和Gitea可以参考下面文章 https://blog.csdn.net/weixin_46533577/article/details/134644144 我的另一篇文章 介绍 前端 先说下自己的情况&#xff0c;因为自己服务器原因&#xff0c;使用的服务器内…

防篡改,Tripwire的快速安装与简洁使用

防篡改Tripwire 一、安装 1.准备&#xff08;centos7的yum不带tripwire&#xff09; wget https://mirrors.ustc.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm rpm -ivh epel-release-7-14.noarch.rpm yum -y install tripwire另一个方法 cd /etc/yum.rep…

面向对象的四大特性:封装、抽象、继承、多态

封装&#xff08;Encapsulation&#xff09; 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口&#xff0c;授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持&#xff0c;例如 Java 中的 private、protected、pu…

Linux基础项目开发1:量产工具——输入系统(三)

前言&#xff1a; 前面我们已经实现了显示系统&#xff0c;现在我们来实现输入系统&#xff0c;与显示系统类似&#xff0c;下面让我们一起来对输入系统进行学习搭建吧 目录 一、数据结构抽象 1. 数据本身 2. 设备本身&#xff1a; 3. input_manager.h 二、触摸屏编程 to…