当前位置: 首页 > news >正文

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

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

相关文章:

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

1.原理 要想实现开机自启动&#xff0c;首先&#xff0c;QT是没有这种实现的&#xff0c;最好是靠电脑开机的启动目录启动软件&#xff0c;下面这个目录 /etc/xdg/autostart 这是操作系统中用于配置启动项的目录&#xff0c;该目录下存放着开机自启动的启动器(.desktop)文件…...

TCP 基本认识

1&#xff1a;TCP 头格式有哪些&#xff1f; 序列号&#xff1a;用来解决网络包乱序问题。 确认应答号&#xff1a;用来解决丢包的问题。 2&#xff1a;为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f; IP 层是「不可靠」的&#xff0c;它不保证网络包的交付…...

智慧城市包括哪些内容?有哪些智慧城市物联网方案?

数字城市、智慧城市的发展&#xff0c;离不开对公共基础设施的数字化、智慧化改造升级。通过融合边缘计算、5G、物联网、数字孪生、人工智能等新一代信息技术&#xff0c;助力传统公共基础设施提升增强全流程数据能力、计算能力、服务能力&#xff0c;从而不断丰富公共基础设施…...

Arkts@Watch装饰器与内置组件双向同步深度讲解与实战应用【鸿蒙专栏-14】

文章目录 ArkTS 状态管理深度解析:@Watch 和 $$ 运算符的妙用@Watch 装饰器:状态变量的敏感监听装饰器说明语法说明观察变化和行为表现限制条件使用场景$$ 运算符:内置组件状态的双向同步使用规则使用示例ArkTS 深度探索:@Watch 装饰器与 $$ 运算符的进阶应用进阶应用:@Wa…...

iMazing是什么软件?2024最新版本如何下载

iMazing是一款功能强大的iOS设备管理软件&#xff0c;它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外&#xff0c;它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性&#xff0c;并教…...

LeetCode(40)同构字符串【哈希表】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 同构字符串 1.题目 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0…...

【代码随想录算法训练营-第一天】【数组】704. 二分查找、27. 移除元素

LeetCode-704.二分查找 【错误】第一遍提交的代码 主要错误点&#xff1a; 没弄清楚区间的定义导致&#xff1a;r 在定义处的赋值和 if 判断之后 r 的复制没有想清楚&#xff1b;没有搞清楚判断循环结束的条件&#xff1b;没有搞明白区间的定义&#xff0c;r 和 l 如何赋值&a…...

[教程] 一文进阶Redis

Redis进阶 过期时间&#xff08;Expire&#xff09; Redis 的过期时间&#xff08;Expire&#xff09;功能是一种数据生命周期管理机制&#xff0c;允许为键设置一个过期时间。一旦达到该时间&#xff0c;键会自动被删除。这对于管理缓存数据特别有用&#xff0c;可以自动清理…...

通用plantuml模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …...

网站公安备案流程

1.公安备案网址 https://beian.mps.gov.cn/ 选择用户登录->法人用户登录 左边的码下载APP&#xff0c;登上去之后用APP扫右边的码&#xff0c;人脸识别...

关于使用若依,并不会自动分页的解决方式

关于使用若依,并不会自动分页的解决方式 如果只是单纯的使用一次查询list,并不会触发这个bug 例如: 但是我们如果对里面的数据进行调整修改的话就会触发这个bug 例如: 此时可以看到我对数据进行了转换!!!,这时如果超出数据10条,实际我们拿到的永远是10条,具体原因这里就不展…...

在PyCharm中配置PyQt5环境

在PyCharm中配置PyQt5环境 文章目录 1.安装第三方库2.PyQt5设计器3.PyUIC转换工具 &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1…...

SIFI 极值点拟合的详细推导过程

在获得高斯差分金字塔之后&#xff0c;我们可以根据邻近尺度和邻近像素一共 26 个像素点的灰度值和中心像素点的灰度值比较&#xff0c;如果中心像素点的值是最大或者最小的&#xff0c;则作为极值点保留下来。 但是我们知道像素是网格排布的&#xff0c;也就是说是离散的&…...

Kontakt v7.7.2(音频采样器)

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…...

Drawer抽屉(antd-design组件库)简单用法

1.Drawer抽屉 屏幕边缘滑出的浮层面板。 2.何时使用 抽屉从父窗体边缘滑入&#xff0c;覆盖住部分父窗体内容。用户在抽屉内操作时不必离开当前任务&#xff0c;操作完成后&#xff0c;可以平滑地回到原任务。 需要一个附加的面板来控制父窗体内容&#xff0c;这个面板在需要时…...

Android控件全解手册 - 多语言切换完美解决方案(兼容7.0以上版本)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

Android-P CameraSerivce

0 前言 本文重点分析Android-P的CameraService实现。 验证:Goldfish模拟器 1 定义 图1.1 CameraService ICameraServiceframeworks/av/camera/aidl/android/hardware/ICameraService.aidlBnCameraServiceout/soong/.intermediates/frameworks/av/camera/libcamera_client/an…...

21.Oracle的程序包(Package)

Oracle的程序包Package 一、Package的概述1、什么是Oracle11g的Package2、Package的作用是什么3、常见的系统内置Package 二、创建Package的相关语法1、Package的创建语法2、Package的删除3、具体案例4、Package的使用5、与Package相关的其他语法 三、常见内置程序包的使用1、…...

Spring 日志

日志的作用: 1.定位和发现问题 2.系统监控 3.数据采集 观察日志 先写一段打印日志的代码 日志内容 日志级别分类 默认日志级别是Info,级别一下的就不打印了 Spring 帮我们集成了日志框架,我们直接使用即可 我们测试一下用日志框架打印日志是如何 我们就会发现打印的结果跟…...

webpack如何处理浏览器的样式兼容问题postcss

一、准备工作 css/index.css添加样式 .word {color: red;user-select: none; } 为了兼容不同的浏览器我们需要添加前缀比如&#xff1a; -webkit-user-select: none; 这个工作可以通过postcss的插件postcss-preset-env处理 二、安装依赖 pnpm i -D postcss postcss-loader…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...