硬件:樹莓派4b
系統:raspbian
軟件:qt打包的程序
最近筆者正在做樹莓派原裝系統上開發qt 程序,然后qt程序打包后希望樹莓派能開機自啟,經過兩天的時間在網上查看各種資料,然后經過實踐得出可以實現的方式
1.在 /etc/xdg/autostart 目錄下存放着開機自啟動的啟動器(.desktop)文件
現在針對上面方式進行介紹:
方式:在 /etc/xdg/autostart 目錄下存放着開機自啟動的啟動器(.desktop)文件
原理: /etc/xdg/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