Qtの基礎 - CUIソフトウェア

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Qtは、GUIソフトウェアを開発するために使用されているが、CUIソフトウェアも開発できる。
ただし、CUIは[閉じる]ボタンのように終了する機能が無いため、ソフトウェアから適当なタイミングで閉じるようにしなければならない。

ここでは、Qtにおける基本的なCUIソフトウェアの開発手順を記載する。


CUIソフトウェアの開発手順

例えば、以下に示すようなコンソールアプリケーションがあるとする。

このコンソールアプリケーションは、QCoreApplicationクラスのexecメソッドによりアプリケーションは待機状態となり、
exitメソッドを呼ぶまで待機を続ける。

 int main(int argc, char * argv[])
 {
    QCoreApplication a(argc, argv);
 
    int count = 1000;
    while(--count) {
       printf("Count = %d\n", count);
    }
 
    return a.exec();
 }


この待機状態が不要の場合は、アプリケーションを終了する時に任意の地点でexitメソッドを呼ぶランナークラスを作成すればよい。

例えば、以下に示すようなRunnerクラスを定義する。
そして、Runnerクラスのrunスロット内にアプリケーションのメイン処理を記述して、処理を終了する時にQCoreApplicationクラスのexitメソッドを呼び出す。

 // Runner.h
 
 #ifndef RUNNER_H
 #define RUNNER_H
 
 #include <QObject>
 
 class Runner : public QObject
 {
    Q_OBJECT
 
 public slots:
    void run();  // runスロットメソッドにアプリケーションのメイン処理を記述する
 };
 
 #endif // RUNNER_H


 // Runner.cppファイル
 
 #include <QCoreApplication>
 #include <Runner.h>
 
 void Runner::run()
 {
    // アプリケーションのメイン処理
 
    // ...略
 
    QCoreApplication::exit(0);  // アプリケーションを終了する
 }


重要なことは、QTimerクラスのsingleShotメソッドのタイムアウト時間を0に設定することである。
これは、アプリケーションの全てのイベント (描画処理等) が処理された後に、runメソッドで定義した処理が実行される。

 #include <QCoreApplication>
 #include <QTimer>
 #include "Runner.h"
 
 int main(int argc, char *argv[])
 {
    QCoreApplication a(argc, argv);
 
    // ランナー開始
    Runner runner;
    QTimer::singleShot(0, &runner, SLOT(run()));
 
    return a.exec();
 }



まとめ

上記のセクションにおいて、CUIソフトウェアの開発手順について記載したが、重要なことは以下の3つである。

  • QApplication::exitを呼び出すとCUIソフトウェアが終了できる。
  • QTimer::singleShotからランナークラスを実行する。
  • ランナークラスにメイン処理を記述して、任意の地点でexit関数を実行する。