Linux(Ubuntu/Debian)下將自己應用程序(QT)設置開機自啟動


工作中需要編寫了一個QT程序,需要設置開機啟動,在網上找了很多方法,都不太行,最后找到了一個可用的方法,在這里記錄一下。

環境:Linux(Ubuntu/Debian)(方德)
QT:5.6.2

一、原理及簡單操作

原理:

在 /etc/xdg/autostart 目錄下存放着開機自啟動的啟動器(.desktop)文件,我們可以為自己程序寫一個.desktop文件,然后放到這里來,實現開機自啟動。

2020年9月18日更新:在當前用戶目錄下,即$HOME下,路徑為$HOME/.config/autostart下放置.desktop文件可以起到為當前用戶創建一個開機啟動文件

具體實現方法:

1.准備好自己的應用程序,這里我的程序路徑為/home/fan/FanTest/FanTestAPP。也可以再准備一個程序圖標文件,,最好是64x64的,這里我的程序圖標路徑為/home/fan/FanTest/FanTest.png。以下命令均在此文件夾下使用。

2.在程序所在的文件夾下創建一個FanTest.desktop的文件,名稱可以自己起,后綴為.desktop,我使用的命令是:

touch FanTest.desktop

或者你可以使用其他的方式創建,比如 vim FanTest.desktop。

3.編輯這個文件,添加以下內容,注意把注釋刪除,末尾不要留空格:

[Desktop Entry] //必須
Version=1.0.0 //版本,可選
Name=FanTest //程序名,必須
Name[zh_CN]=帆 //中文程序名,可選
Exec=/home/fan/FanTest/FanTestAPP //可執行程序路徑,必須。路徑必須是絕對路徑
Icon=/home/fan/FanTest/FanTest.png //程序圖標,可選。路徑必須是絕對路徑,末尾不能有空格,否則將會導致無法加載圖標
Type=Application //類型為應用程序,必選

編輯后保存,在終端中輸入以下命令為其添加可執行權限,這樣就可以雙擊打開了,也可以復制到桌面作為快捷方式:

chmod 755 FanTest.desktop

4.使用命令將FanTest.desktop復制到/etc/xdg/autostart下,需要root權限:

sudo cp FanTest.desktop /etc/xdg/autostart/

這時重啟一下就可以發現程序能夠自啟動了。

5.如果想要取消自啟動,刪除/etc/xdg/autostart/下的FanTest.desktop文件即可:

sudo rm -f /etc/xdg/autostart/FanTest.desktop

二、我用QT實現勾選復選框改變是否自啟動的功能

這個程序實現了通過勾選復選框改變是否自啟動的功能,原理為上述原理,非常簡單,有簡單注釋。

我的基類是widget,如果需要別的請自行更改。

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QFileInfo>
#include <string>

#define APPNAME "FanTest"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    check_autostart(); //啟動時檢查
}

Widget::~Widget()
{
    delete ui;
}

void Widget::set_autostart(){
    QString app_name = APPNAME;
    QString desktop_dir = "/usr/share/applications/" + app_name + ".desktop";
    QString cmd = "pkexec cp " + desktop_dir + " /etc/xdg/autostart/" + app_name + ".desktop";
    std::string str = cmd.toStdString();
    const char *cmd_cs= str.c_str();
    system(cmd_cs); //使用系統命令將.desktop從源地址復制到autostart目錄下實現開機自啟動,pkexec是彈窗獲取root權限
}
void Widget::remove_autostart(){
    QString app_name = APPNAME;
    QString cmd = "pkexec rm -f /etc/xdg/autostart/"+app_name+".desktop";
    std::string str = cmd.toStdString();
    const char *cmd_cs= str.c_str();
    system(cmd_cs);//使用系統命令刪除autostart目錄下.desktop文件實現取消開機自啟動
}

void Widget::check_autostart()
{
    //檢查autostart目錄下的.desktop文件是否存在實現是否設置自啟動了
    QString app_name = APPNAME;
    QFileInfo file("/etc/xdg/autostart/"+app_name+".desktop");
    if(file.exists()==true){
        ui->checkBox->setChecked(true);
    }
    else{
        ui->checkBox->setChecked(false);
    }
}

void Widget::on_checkBox_clicked(bool checked)
{
    if(checked == true){
        set_autostart();
        check_autostart();//設置完檢查是防止沒設置成功
    }
    else{
        remove_autostart();
        check_autostart();
    }
}
//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_checkBox_clicked(bool checked);

private:
    Ui::Widget *ui;

    void set_autostart();
    void remove_autostart();
    void check_autostart();
};

#endif // WIDGET_H

ui就不貼了,只有一個復選框,對象名是默認的checkBox。


參考資料:

[1]ubuntu開機自動運行用Qt寫的程序

https://blog.csdn.net/zilanpotou182/article/details/71173361

[2]Qt 判斷文件是否存在

https://www.cnblogs.com/cszlg/p/3234823.html

[3]linux如何實現開機加載完圖形界面后自動運行自己寫的一個程序

https://blog.csdn.net/jianglei_love/article/details/51559229


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM