QSplashScreen::messageChanged()のしくみと使い方を徹底解説


QSplashScreen::messageChanged() は、Qt Widgetsライブラリにおける QSplashScreen クラスのシグナルです。このシグナルは、スプラッシュスクリーンに表示されているメッセージが変更されたときに発生します。

用途

QSplashScreen::messageChanged() シグナルは、スプラッシュスクリーンに表示されるメッセージを動的に更新するために使用できます。たとえば、アプリケーションの起動中に読み込み進捗状況を表示したり、異なるメッセージをローテーションしたりするために使用できます。

接続方法

QSplashScreen::messageChanged() シグナルを接続するには、次のコードを使用します。

QObject::connect(splashScreen, &QSplashScreen::messageChanged, this, &yourSlot);

ここで、splashScreenQSplashScreen オブジェクト、yourSlot はシグナルが発生したときに呼び出されるスロットです。

スロットの実装

yourSlot スロットは、const QString &message パラメータを受け取ります。このパラメータは、新しいメッセージの内容です。スロット内で、新しいメッセージをスプラッシュスクリーンに表示したり、他の処理を実行したりできます。

次のコード例は、スプラッシュスクリーンに読み込み進捗状況を表示する方法を示します。

void MyWidget::showSplashScreen()
{
    splashScreen = new QSplashScreen(this);
    splashScreen->show();

    connect(splashScreen, &QSplashScreen::messageChanged, this, &MyWidget::updateProgressMessage);

    for (int i = 0; i < 100; ++i) {
        splashScreen->showMessage(QString("読み込み中... %1%").arg(i));
        QThread::sleep(100);
    }

    splashScreen->close();
}

void MyWidget::updateProgressMessage(const QString &message)
{
    // スプラッシュスクリーンに新しいメッセージを表示
    splashScreen->showMessage(message);
}

このコード例では、showSplashScreen() 関数は QSplashScreen オブジェクトを作成し、表示します。次に、messageChanged() シグナルを updateProgressMessage() スロットに接続します。updateProgressMessage() スロットは、新しいメッセージをスプラッシュスクリーンに表示します。

  • QSplashScreen::clearMessage() 関数を使用して、スプラッシュスクリーンに表示されているメッセージをクリアできます。
  • QSplashScreen::showMessage() 関数を使用して、スプラッシュスクリーンにメッセージを表示できます。
  • QSplashScreen::message() 関数を使用して、スプラッシュスクリーンに表示されている現在のメッセージを取得できます。


例1: 読み込み進捗状況を表示する

この例では、スプラッシュスクリーンに読み込み進捗状況を表示する方法を示します。

#include <QApplication>
#include <QSplashScreen>
#include <QThread>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QSplashScreen splashScreen;
    splashScreen.show();

    connect(&splashScreen, &QSplashScreen::messageChanged, &splashScreen, &QSplashScreen::updateProgressMessage);

    for (int i = 0; i < 100; ++i) {
        splashScreen.showMessage(QString("読み込み中... %1%").arg(i));
        QThread::sleep(100);
    }

    splashScreen.close();

    return app.exec();
}

void QSplashScreen::updateProgressMessage(const QString &message)
{
    // スプラッシュスクリーンに新しいメッセージを表示
    showMessage(message);
}

例2: 異なるメッセージをローテーションする

この例では、スプラッシュスクリーンに異なるメッセージをローテーションする方法を示します。

#include <QApplication>
#include <QSplashScreen>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QSplashScreen splashScreen;
    splashScreen.show();

    QStringList messages = {
        "メッセージ1",
        "メッセージ2",
        "メッセージ3"
    };

    int messageIndex = 0;
    QTimer timer(&splashScreen);
    timer.setInterval(2000);
    connect(&timer, &QTimer::timeout, [&]() {
        splashScreen.showMessage(messages[messageIndex]);
        messageIndex = (messageIndex + 1) % messages.size();
    });
    timer.start();

    return app.exec();
}
  • このシグナルは、スプラッシュスクリーンに動的にメッセージを表示するために使用できます。
  • QSplashScreen::messageChanged() シグナルは、スプラッシュスクリーンに表示されているメッセージが変更されたときに発生します。
  • QSplashScreen クラスは、アプリケーションの起動時に表示されるスプラッシュスクリーンを作成するために使用できます。
  • 上記のコードは、Qt Widgetsライブラリの QSplashScreen クラスを使用しています。
  • QSplashScreen クラスには、他にも多くの機能があります。詳細は、Qt ドキュメントを参照してください。
  • 上記のコードはあくまで例であり、ニーズに合わせて変更する必要があります。


以下に、QSplashScreen::messageChanged() の代替方法をいくつか紹介します。

タイマーを使用する

スプラッシュスクリーンに表示するメッセージを動的に更新したい場合は、タイマーを使用することができます。タイマーの timeout() シグナルを接続し、シグナルハンドラ内でメッセージを更新するコードを記述します。

QTimer timer;
timer.setInterval(2000);
connect(&timer, &QTimer::timeout, this, &MyWidget::updateMessage);
timer.start();

このコード例では、updateMessage() スロットが 2 秒ごとに呼び出され、スプラッシュスクリーンに新しいメッセージが表示されます。

カスタムスレッドを使用する

スプラッシュスクリーンの更新処理をアプリケーションのメインスレッドから分離したい場合は、カスタムスレッドを使用することができます。カスタムスレッド内でメッセージを更新し、スレッドシグナルを使用してメインスレッドに通知します。

class MessageThread : public QThread
{
public:
    void run() override
    {
        for (int i = 0; i < 100; ++i) {
            emit messageChanged(QString("読み込み中... %1%").arg(i));
            QThread::sleep(100);
        }
    }

signals:
    void messageChanged(const QString &message);
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QSplashScreen splashScreen;
    splashScreen.show();

    MessageThread thread;
    connect(&thread, &MessageThread::messageChanged, &splashScreen, &QSplashScreen::showMessage);
    thread.start();

    return app.exec();
}

このコード例では、MessageThread クラスがカスタムスレッドとして使用されます。run() メソッド内で、スレッドは 100 回ループし、各ループで新しいメッセージを messageChanged() シグナルに送信します。messageChanged() シグナルは、スプラッシュスクリーンに新しいメッセージを表示するために接続されています。

QProgressBar を使用する

読み込み進捗状況を表示したい場合は、QProgressBar を使用することができます。QProgressBar は、進捗状況を視覚的に表示するのに適しています。

QProgressBar progressBar;
progressBar.setValue(0);

for (int i = 0; i < 100; ++i) {
    progressBar.setValue(i);
    QThread::sleep(100);
}

このコード例では、QProgressBar オブジェクトが作成され、値が 0 に設定されます。ループ内で、setValue() メソッドを使用して QProgressBar の値を更新し、進捗状況を視覚的に表示します。

カスタムウィジェットを使用する

上記の方法でニーズが満たされない場合は、カスタムウィジェットを作成してスプラッシュスクリーンに表示することができます。カスタムウィジェット内でメッセージを更新し、必要な機能を実装することができます。