硬件:树莓派4b
系统:raspbian
软件:qt打包的程序
最近笔者正在做树莓派原装系统上开发qt 程序,然后qt程序打包后希望树莓派能开机自启,经过两天的时间在网上查看各种资料,然后经过实践得出两种可以实现的方式:
1.修改.profile的方法
2.在 /etc/xdg/autostart 目录下存放着开机自启动的启动器(.desktop)文件
现在针对上面两种方式进行介绍:
方式一:修改.profile的方法
原理:登录后,系统会自动运行./profile,于是就实现了开机自启动qt程序。
1.以用户pi(默认就是pi)打开终端,输入以下命令:
sudo nano .profile
2.在打开的文档后面增加你要增加一句(nano的用法比vi简单,这里就不赘述了):
export DISPLAY=:0 && /home/pi/file
其中/home/pi/file是要启动的文件的路径,加入“&”可以防止阻塞。如果需要root权限,可以这样:
export DISPLAY=:0 && sudo /home/pi/file &
注意:这里与shell命令不同,不是以往的sudo ./home/pi/file,这里是没有“.”的。 然后,程序就能开机运行了,再隐藏下任务栏和更换壁纸,开机后基本不会让使用者看到多余的内容。
方式二:在 /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