「Qtの基礎 - CUIソフトウェア」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
8行目: 8行目:
== CUIソフトウェアの開発手順 ==
== CUIソフトウェアの開発手順 ==
例えば、以下のようなCUIソフトウェアのソースコードを記述したとする。<br>
例えば、以下のようなCUIソフトウェアのソースコードを記述したとする。<br>
<br>
以下のソースコードにおいて、CUIソフトウェアは、永遠に終了しないプログラムになってしまう。<br>
なぜなら、<code>QCoreApplication</code>クラスの<code>exec</code>メソッドは、<code>exit</code>メソッドが呼ばれるまでループし続けるからである。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  int main(int argc, char * argv[])
  int main(int argc, char * argv[])
23行目: 26行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
上記のソースコードでは、CUIソフトウェアの場合は永遠に終了しないプログラムになってしまう。<br>
これを解決するには、主の処理が終了する時、任意の地点で<code>exit</code>関数を呼び出すランナークラスを作成すればよい。<br>
なぜなら、<code>QCoreApplication</code>の<code>exec</code>関数は、<code>exit</code>関数が呼ばれるまでループし続けるからである。<br>
<br>
<br>
これを解決するには、主の処理が終了する時、任意の地点で<code>exit</code>関数を呼び出すランナークラスを作成すればよい。<br>
例えば、以下のようなCUIRunnerクラスを定義する。<br>
例えば、以下のようなCUIRunnerクラスを定義する。<br>
そして、CUIRunnerクラスのrunスロットメソッド内部にメイン処理を記述して、処理を終了する時にexit関数を呼び出せばよい。<br>
そして、CUIRunnerクラスのrunスロット内にメイン処理を記述して、処理を終了する時に<code>QCoreApplication</code>クラスの<code>exit</code>メソッドを呼び出せばよい。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // CUIRunner.h
  // CUIRunner.h
63行目: 64行目:
<br>
<br>
ここで重要なことは、<code>QTimer</code>クラスの<code>singleShot</code>メソッドのタイムアウト時間を0に設定していることである。<br>
ここで重要なことは、<code>QTimer</code>クラスの<code>singleShot</code>メソッドのタイムアウト時間を0に設定していることである。<br>
このように記述すると、ウインドウシステムの全てのイベント(描画処理等)が処理された後に、runメソッドで定義した処理が実行される。<br>
このように記述することにより、ウインドウシステムの全てのイベント(描画処理等)が処理された後に、runメソッドで定義した処理が実行される。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <QCoreApplication>
  #include <QCoreApplication>
  #include <QTimer>
  #include <QTimer>
  #include <CUIRunner.h>
  #include "CUIRunner.h"
   
   
  int main(int argc, char *argv[])
  int main(int argc, char *argv[])
74行目: 75行目:
   
   
     // ランナー開始
     // ランナー開始
     CUIRunnaer runner;
     CUIRunner runner;
     QTimer::singleShot(0, &runner, SLOT(run()));
     QTimer::singleShot(0, &runner, SLOT(run()));
   
   

2021年6月10日 (木) 04:52時点における版

概要

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

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


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

例えば、以下のような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関数を呼び出すランナークラスを作成すればよい。

例えば、以下のようなCUIRunnerクラスを定義する。
そして、CUIRunnerクラスのrunスロット内にメイン処理を記述して、処理を終了する時にQCoreApplicationクラスのexitメソッドを呼び出せばよい。

 // CUIRunner.h
 
 #ifndef CUIRUNNER_H
 #define CUIRUNNER_H
 
 #include <QObject>
 
 class CUIRunner : public QObject
 {
    Q_OBJECT
 
 public slots:
    void run();  // runスロットメソッド内部でメイン処理を実行する
 };
 
 #endif // CUIRUNNER_H


 // runメソッドの定義
 #include <QCoreApplication>
 #include <CUIRunner.h>
 
 void CUIRunner::run()
 {
    // メイン処理
    // ...略
 
    QCoreApplication::exit(0);  // 閉じる(ループから抜ける)
 }


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

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



まとめ

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

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