Qt5 での QOverload の使用法

QOverload の使用を説明するために、ホスト間のネットワーク到達可能性の検出を実装します。Ping は、ホスト間の到達可能性を検出するために使用されるネットワーク ツールです。

UIのブロックを避けるために、QProcessの非同期メソッドを使用してPingコマンドを実行し、QProcessのシグナルを接続して実行結果を取得できます。これにより、バックグラウンドで ping を実行している間、UI の応答性が維持されます。サンプルコードは次のとおりです。

この記事の特典として、Qt 開発学習教材パッケージ、技術ビデオ (C++ 言語基礎、C++ デザイン パターン、Q​​t プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発イメージ描画、QT ネットワーク、QT など) を無料で受け取ることができます。データベースプログラミング、QTプロジェクト実戦、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

#include <QCoreApplication>
#include <QTimer>
#include <QProcess>
#include <QDebug>

class PingChecker : public QObject
{
    Q_OBJECT

public:
    explicit PingChecker(QObject *parent = nullptr)
        : QObject(parent)
    {
        // 创建定时器并设置定时间隔(单位:毫秒)
        timer = new QTimer(this);
        timer->setInterval(5000);  // 每隔5秒执行一次Ping检测

        // 连接定时器的timeout信号到Ping检测槽函数
        connect(timer, &QTimer::timeout, this, &PingChecker::checkPing);

        // 启动定时器
        timer->start();
    }

private slots:
    void checkPing()
    {
        QString ipAddress = "127.0.0.1";  // 替换为你要Ping的IP地址

        QProcess* pingProcess = new QProcess(this);
        pingProcess->start("ping", QStringList() << "-c" << "1" << ipAddress);  // "-c 1"表示只发送一个Ping请求

        // 连接QProcess的finished信号到处理结果的槽函数
        connect(pingProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
                this, [this, ipAddress](int exitCode, QProcess::ExitStatus exitStatus) {
            QString pingResult = pingProcess->readAllStandardOutput();
            bool isReachable = pingResult.contains("1 packets transmitted, 1 received");

            if (isReachable) {
                qDebug() << "Ping succeeded. IP address" << ipAddress << "is reachable.";
            } else {
                qDebug() << "Ping failed. IP address" << ipAddress << "is not reachable.";
            }

            pingProcess->deleteLater();
        });
    }

private:
    QTimer *timer;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    PingChecker pingChecker;

    return a.exec();
}

上記のコードでは、ラムダ式を使用して、QProcess の完成したシグナルを匿名スロット関数に接続します。これにより、ping 操作が完了し、QProcess オブジェクトがスロット関数で解放された後に結果を非同期に処理できるようになります。これにより、UI スレッドのブロックが回避されます。

Ping コマンドを非同期で実行する場合、メモリ リークを防ぐために、作成された QProcess オブジェクトを時間内に解放する必要があることに注意してください。スロット関数で pingProcess->deleteLater() を使用して QProcess オブジェクトの解放を遅らせ、スロット関数の実行後に確実に解放されるようにします。

こうすることで、バックグラウンドで ping 検出を実行し、UI の応答性を維持できます。

// 连接QProcess的finished信号到处理结果的槽函数
        connect(pingProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
                this, [this, ipAddress](int exitCode, QProcess::ExitStatus exitStatus) {
            QString pingResult = pingProcess->readAllStandardOutput();
            bool isReachable = pingResult.contains("1 packets transmitted, 1 received");

この例では QQverload が使用されており、詳細な説明は次のとおりです。

シグナルをスロットに接続する場合、Qt はいくつかの異なる接続方法を提供します。1 つの方法は、QOverload テンプレート クラスを使用してスロット関数のパラメーター タイプを指定することです。

QOverload は、オーバーロードされた関数のリンケージの問題を解決するために使用されるテンプレート クラスです。そのテンプレートパラメータは、リンクされるスロット関数の引数リストです。この場合、QOverload<int, QProcess::ExitStatus> は、スロット関数のパラメーターが int と QProcess::ExitStatus であることを指定します。

QProcess クラスには、オーバーロードされた終了シグナルがあり、int 型の exitCode と QProcess::ExitStatus 型の exitStatus の 2 つのパラメーターがあります。したがって、このオーバーロードされた信号に接続する場合は、Qt が信号とスロット関数を正しく照合できるように、QOverload を使用してスロット関数のパラメーター タイプを指定する必要があります。

上記のサンプルコードでは、ラムダ式をスロット関数として使用しました。QOverload<int, QProcess::ExitStatus>::of を使用することで、int と QProcess::ExitStatus の 2 つのパラメーターを取る QProcess::finished シグナルのオーバーロードされたバージョンに接続していることを Qt に伝えます。

QOverload を使用する利点は、タイプ セーフティが提供され、接続された信号とスロットのパラメーター タイプが確実に一致することです。指定されたパラメータの型が一致しない場合、コンパイラはエラーを発行します。

要約すると、QOverload<int, QProcess::ExitStatus>::of は、QProcess::finished シグナルのオーバーロードされたバージョンに接続するスロット関数のパラメーター タイプを指定するために使用されます。ここで、int パラメーターは終了コードを表します。プロセス、QProcess::ExitStatus このパラメータはプロセスの終了ステータスを示します。

この記事の特典として、Qt 開発学習教材パッケージ、技術ビデオ (C++ 言語基礎、C++ デザイン パターン、Q​​t プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発イメージ描画、QT ネットワーク、QT など) を無料で受け取ることができます。データベースプログラミング、QTプロジェクト実戦、QSS、OpenCV、Quickモジュール、面接での質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_73443478/article/details/131231749