「Qtの基礎 - CUIソフトウェア」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == Qtは、GUIソフトウェアを開発するために使用されているが、CUIソフトウェアも開発できる。<br> ただし、CUIは[閉じる]…」) |
|||
24行目: | 24行目: | ||
<br> | <br> | ||
上記のソースコードでは、CUIソフトウェアの場合は永遠に終了しないプログラムになってしまう。<br> | 上記のソースコードでは、CUIソフトウェアの場合は永遠に終了しないプログラムになってしまう。<br> | ||
なぜなら、<code> | なぜなら、<code>QCoreApplication</code>の<code>exec</code>関数は、<code>exit</code>関数が呼ばれるまでループし続けるからである。<br> | ||
<br> | <br> | ||
これを解決するには、主の処理が終了する時、任意の地点で<code>exit</code>関数を呼び出すランナークラスを作成すればよい。<br> | これを解決するには、主の処理が終了する時、任意の地点で<code>exit</code>関数を呼び出すランナークラスを作成すればよい。<br> | ||
例えば、以下のようなCUIRunnerクラスを定義する。<br> | 例えば、以下のようなCUIRunnerクラスを定義する。<br> | ||
そして、CUIRunnerクラスのrunスロットメソッド内部にメイン処理を記述して、処理を終了する時にexit関数を呼び出せばよい。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// CUIRunner.h | // CUIRunner.h | ||
47行目: | 48行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// runメソッドの定義 | // runメソッドの定義 | ||
62行目: | 62行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
ここで重要なことは、<code>QTimer</code>クラスの<code>singleShot</code>メソッドのタイムアウト時間を0に設定していることである。<br> | |||
このように記述すると、ウインドウシステムの全てのイベント(描画処理等)が処理された後に、runメソッドで定義した処理が実行される。<br> | このように記述すると、ウインドウシステムの全てのイベント(描画処理等)が処理された後に、runメソッドで定義した処理が実行される。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
75行目: | 75行目: | ||
// ランナー開始 | // ランナー開始 | ||
CUIRunnaer runner; | CUIRunnaer runner; | ||
QTimer::singleShot(0, &runner, SLOT( | QTimer::singleShot(0, &runner, SLOT(run())); | ||
return a.exec(); | return a.exec(); |
2020年12月18日 (金) 12:05時点における版
概要
Qtは、GUIソフトウェアを開発するために使用されているが、CUIソフトウェアも開発できる。
ただし、CUIは[閉じる]ボタンのように終了する機能が無いため、ソフトウェアから適当なタイミングで閉じるようにしなければならない。
ここでは、Qtにおける基本的なCUIソフトウェアの開発手順を記載する。
CUIソフトウェアの開発手順
例えば、以下のようなCUIソフトウェアのソースコードを記述したとする。
int main(int argc, char * argv[])
{
QCoreApplication a(argc, argv);
int count = 1000;
while(--count)
{
printf("Count = %d\n", count);
}
return a.exec();
}
上記のソースコードでは、CUIソフトウェアの場合は永遠に終了しないプログラムになってしまう。
なぜなら、QCoreApplication
のexec
関数は、exit
関数が呼ばれるまでループし続けるからである。
これを解決するには、主の処理が終了する時、任意の地点でexit
関数を呼び出すランナークラスを作成すればよい。
例えば、以下のようなCUIRunnerクラスを定義する。
そして、CUIRunnerクラスのrunスロットメソッド内部にメイン処理を記述して、処理を終了する時に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);
// ランナー開始
CUIRunnaer runner;
QTimer::singleShot(0, &runner, SLOT(run()));
return a.exec();
}
まとめ
上記のセクションにおいて、CUIソフトウェアの開発手順について記載したが、重要なことは以下の3つである。
QApplication::exit
を呼び出すとCUIソフトウェアが終了できる。QTimer::singleShot
からランナークラスを実行する。- ランナークラスにメイン処理を記述して、任意の地点で
exit
関数を実行する。