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.名前: デスクトップ ファイルの名前、/etc/xdg/autostart ディレクトリに表示されるランチャーの名前

3.タイプ: デスクトップ ファイルのタイプを指定するために使用されます (アプリケーション、リンク、ディレクトリの 3 つのタイプを含む)。

4.アイコン: デスクトップファイルにはアイコンがありません

        アイコン: アプリケーションアイコンのフルパスを指定します(拡張子は省略可能)。

        アイコンはpng形式、svg形式などをサポートしています。アイコンの推奨サイズは128x128です。

したがって、基本的なデスクトップ ファイル テンプレートは次のようになります。

[デスクトップ入力]

名前=<アプリケーション名>

タイプ=アプリケーション

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 の起動ディレクトリにランチャー ファイルをコピーするシェル スクリプトを生成します。

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 プログラムは、起動後に自動的に開始されます。コードを使用して、賢く開始またはキャンセルしてください。長時間検索しても、インターネット上で見つかりませんでした。૮₍ ◞‸◟₎ა。後で、時間を見つけました。この原理を理解し、理解しました。ここに例があります。役に立った場合は、忘れずに「いいね」を付けて、多くの人がこの種の関数コードを望んでいるかどうかを確認してください。

または、より良い解決策やその他の質問がある場合は、コメントしてメッセージを残して話し合ってください。੭ ᐕ)੭

おすすめ

転載: blog.csdn.net/qq_44667165/article/details/134692485