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程序开机自启动,用代码实现智能化开启或取消,找了很久在网上都没有找到一个,૮₍ ◞‸◟₎ა ,后面就自己找了个时间了解这个原理后,弄了一个例子出来,对你有帮助的,记得点个赞,让我看看是不是有很多人想要这种功能性的代码
或者你们有什么更好的方案或者其他问题的,评论取留言探讨一下੭ ᐕ)੭