4

QGLWidgetをフロントエンドとして使用するOpenGLベースのゲームに取り組んでいます。しかし、すべての不要なオーバーヘッド(および重いQTライブラリを配布する必要がある!)のために、私はGLUTに移行する予定であり、大きな飛躍の前に「Qt-stuff」をより標準的な代替手段に置き換えるプロセスにあります。

フレームレートとfpsタイマーを制御するQTimersを置き換えるために、次のように、app.exec()呼び出しを置き換える単純なループにこれらの関数をくさびで留めようとしています。

//main.cpp
#include <QApplication>
#include <windows.h>
#include "mainwindow.h"

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  MainWindow mainWin;//only contains a glwidget
  mainWin.show();

  do {
    app.processEvents();
    //call draw functions/fps based on system tick count
    //...
    Sleep(10);
  } while (!app.closingDown()); //<-- this doesn't terminate

  return 0;
}

これまでのところ、実行時に正常に動作しますが、(システムの[X]ボタンを使用して)ウィンドウを閉じようとすると、ウィンドウは消えますが、プログラムはバックグラウンドでハングします。問題は、exit()またはclose()が呼び出されたことを示す静的フラグまたはクエリ関数が見つからないことです。 bool closingDown()常にfalseのようで、デストラクタの静的フラグを切り替えて~MainWindow検出しようとしましたが、終了するまで呼び出されないため、これも機能しませんmain。QAppsのaboutToQuit()信号に結び付けるか、Qappから派生クラスを作成してそれをインターセプトすることで、おそらくそれを実行できることはわかっていますが、そのようなものは、信号/スロットから離れるという目的に反します。クラスの外部から、QApplicationがシャットダウンするように命令されたかどうかを確認する簡単な方法はありますか?

4

2 に答える 2

4

再実装できます

void QWidget::closeEvent ( QCloseEvent * event ) 

静的フラグを設定するメソッド。そのメソッドは、ウィンドウからのクローズイベントを呼び出します。

于 2012-09-26T09:55:54.833 に答える
2

その呼び出しのapp.sendPostedEvents();前に追加することをお勧めします。QApplication::processEvents()実際には問題が解決する可能性がありますが、そうでない場合は、少なくとも@dzhonで説明されているイベントハンドラーを使用できます。

Nitpick:Qtは通常、すべて大文字でフォーマットされていません。「QT」と言うと、QuickTimeについて話しているように見えます。

于 2012-09-26T09:59:01.890 に答える