CUIアプリケーションの作り方
QTは大抵はGUIアプリケーションを作るためのライブラリとして使われていますが、GUIだけでなく、コンソールで動くようなCUIアプリケーションも作れます。
ただ、CUIはGUIと違って閉じるボタンのように終了する機能はないのでアプリ側で適当なタイミングで閉じるようにしなければいけません。
例えば次のようなCUIアプリケーションを書いたとします。
int main(int argc, char * argv[]) { QCoreApplication a(argc, argv); int count = 1000; while(--count){ printf("Count = %d\n", count); } return a.exec(); }
GUIアプリならこれでOKですが、CUIだと処理が終わっても永遠に終了しないプログラムになってしまいます。
なぜならQApplicationのexecはexitが呼ばれるまでループし続けるからです。
正しいCUIの作り方
そこで例えば、処理が終わったら適当なタイミングでexit関数を呼び出すためにランナークラスを作ります。
例えば以下のようなCUIRunnerのようなクラスを定義します。
CUIRunner.h#ifndef CUIRUNNER_H #define CUIRUNNER_H #include <QObject> class CUIRunnaer : public QObject { Q_OBJECT public slots: void run(); ///この中でメインの処理を実行 }; #endif // CUIRUNNER_H
このクラスのrunスロット関数でCUIのメインの処理を書き、プログラムを終了したいタイミングでexitを呼び出せばOKです。
#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(); } /**run関数の定義*/ void CUIRunnaer::run() { /// メインの処理... QCoreApplication::exit(0); ///閉じる(ループから抜ける) }
重要なのはQTimerのsingleShotのタイムアウト時間に0を設定していることです。
こうするとウインドウシステムのすべてのイベント(描画処理など)が処理された後にrunで定義した処理が実行されます。
まとめ
ここまでCUIの作り方について書いてきましたが、重要なことは次の3つです。
- QApplication::exitを呼び出すと終了できる
- QTimer::singleShotからランナークラスを実行する
- ランナークラスに処理を書いて適当なタイミングでexitを実行
このことに気をつければQTでもCUIアプリケーションが作れます。
では、また!
関連項目
© Kaz