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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle--索引

文章目录 一、索引是什么?二、索引的原理三、索引的特征四、创建索引的方式五、怎么确认索引六、案列七、复合索引 一、索引是什么? 索引&#xff08;INDEX&#xff09;是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一…

网络通信与TCP.IP协议

网络通信与TCP.IP协议 URI 用字符串标识某一互联网资源&#xff0c;而 URL 表示资源的地点&#xff08;互联网上所处的位置&#xff09;。可见 URL 是 URI 的子集 URL (Uniform Resource Locator)&#xff0c;统一资源定位符 &#xff0c;用于描述一个网络上的资源 DNS: &#…

C# 友元程序集

1.友元程序集 使用友元程序集可以将internal成员提供给其他的友元程序集访问。 程序集FriendTest1.dll [assembly:InternalsVisibleTo("FriendTest2")] namespace FriendTest1 {internal class Friend{string name;public string Name > name;public Friend(str…

Android修行手册 - 一篇文章从0到1搞一个Android Studio插件。

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

更改AndroidStudio模拟器位置

C盘何等的珍贵&#xff0c;可是好多工具&#xff0c;软件非得默认安装在C盘。。导致C盘越来越紧张。。 在日常使用过程中&#xff0c;安装任何软件都会将其安装到非系统盘下&#xff0c;Android模拟器也不能例外。保护好C盘也是日常一个良好的习惯。 Android AVD默认路径&…

数据挖掘 感知机

要使用感知机&#xff0c;我们首先要引入头文件&#xff0c;以下是感知机用的到头文件&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Perceptron from sklearn.model_selection import train_test_…

淘宝商品详情数据接口(店铺搬家、数据分析、代购商城、ERP选品、无货源铺货、品牌监控)

使用淘宝API接口需要以下步骤&#xff1a; 注册开发者账号&#xff1a;在淘宝开放平台&#xff08;https://o0b.cn/anzexi&#xff09;上注册一个开发者账号&#xff0c;并创建一个应用。 获取API密钥&#xff1a;在应用页面上获取API密钥&#xff0c;这是后续调用API接口的凭…

渲染到纹理:原理及WebGL实现

这篇文章是WebGL系列的延续。 第一个是从基础知识开始的&#xff0c;上一个是向纹理提供数据。 如果你还没有阅读过这些内容&#xff0c;请先查看它们。 NSDT在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - …

Vue修改密码功能的源代码

基本需求 输入框不能为空 旧密码表单提交时必须正确 两次输入新密码一致 限定新密码的复杂度&#xff0c;这里是长度在 6 到 20 个字符 <template><el-form ref"form" :model"user" :rules"rules" label-width"80px"><…

线性表——(2)线性表的顺序存储及其运算的实现

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 看到美好&#xff0c;感受美好&a…

ucharts中,当数据为0时,不显示

当为0时&#xff0c;会显示出来&#xff0c;值比较小的时候&#xff0c;数据会显示在一起&#xff0c;不美观 期望效果&#xff1a; 实现步骤&#xff1a; 我是将uCharts插件下载导入到src/uni_modules下的 1、修改src/uni_modules/qiun-data-charts/js_sdk/u-charts/confi…

数据结构day4作业

1.单链表任意位置删除 datetype pos;printf("please input pos");scanf("%d",&pos);headdelete_all(head,pos);Output(head);Linklist delete_all(Linklist head,datetype pos) {if(pos<1||pos>length(head)||headNULL)return head;if(head->…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问A…

数据结构 / day06 作业

1.下面的代码打印在屏幕上的值是多少? /下面的代码打印在屏幕上的值是多少?#include "stdio.h"int compute_data(int arr[], unsigned int len) {long long int result 0;if(result len)return arr[0];resultcompute_data(arr,--len);printf("len%d, res…

基于单片机智能液位水位监测控制系统

**单片机设计介绍&#xff0c; 基于单片机智能液位水位监测控制系统 文章目录 一 概要特点应用场景工作原理实现方式 系统功能实时监测控制调节报警功能数据记录与分析 总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 ## 系统介绍 基于单片机…

【Python】yaml.safe_load()函数详解和示例

在Python中&#xff0c;PyYAML库提供了对YAML&#xff08;YAML Ain’t Markup Language&#xff09;文件的强大支持。YAML是一种直观的数据序列化标准&#xff0c;可以方便地存储和加载配置文件、数据日志等。 yaml.safe_load和yaml.load是Python的PyYAML库提供的两个函数&…

uniapp开发小程序使用axios进行网络请求 uniapp 小程序调试

前言 本篇最好放到项目的【README.md】文件中,方便每次发布的时候检查纠错,毕竟好记性不如烂笔头。而且其他开发者帮忙修改bug、发布新版本的时候,只需要根据这个事项就能实现整个流程的提审发布,提高效率。 1、微信小程序配置 1.1、检查APPID是否正确 测试:wx--------…

函数学习 PTA 1使用函数输出一个整数的逆序数;3判断满足条件的三位数;5使用函数求余弦函数的近似值

其实一共有五道题&#xff0c;但那两道实在太过简单&#xff0c;也不好意思打出来给大家看&#xff0c;那么这篇博客&#xff0c;就让我一次性写三道题吧&#xff01;也当是个小总结&#xff0c;睡前深思。 6-1 使用函数输出一个整数的逆序数 本题要求实现一个求整数的逆序数的…

vuepress-----6、时间更新

# 6、时间更新 基于Git提交时间修改文字时间格式 moment # 最后更新时间 # 时间格式修改 下载库文件 yarn add momentconst moment require(moment); moment.locale(zh-cn)module.exports {themeConfig: {lastUpdated: 更新时间,},plugins: [[vuepress/last-updated,{trans…

智能优化算法应用:基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.参考…