0

私はQtの初心者であり、次の問題が私を夢中にさせています。これには簡単な解決策があると思いますが、これまでのところグーグルなどでは成功しませんでした。

私は完成したコンソールアプリケーションを持っており、私の目標はこのアプリケーションにGUIを追加することです。VS2010 Ultimateを使用していて、Qtアドインを含めました。次に、Qtプロジェクトを作成し、アプリケーションを含む2番目のプロジェクトを含めました。構造は次のようになります。

main.cpp:

#include "PROJECT_gui.h"
#include <QtGui/QApplication>

#include <PROJECT.hpp>

using namespace PROJECT;

int main(int argc, char *argv[]){
  QApplication a(argc, argv);
  PROJECT_GUI w;
  w.show();
  w.setup(argc, argv);
  return a.exec();
}

PROJECT_gui.hpp:

#include <QtGui/QMainWindow>
#include "ui_PROJECT_gui.h"
#include <PROJECT.hpp>

using namespace PROJECT;


class PROJECT_GUI : public QMainWindow {
   Q_OBJECT

public:
   PROJECT_GUI(QWidget *parent = 0, Qt::WFlags flags = 0);
   ~PROJECT_GUI();
   void setup(int argc, char *argv[]) {
   PROJECTEngine_->setGui(ui);
   PROJECTEngine_->setup(argc, argv);}

   Ui::PROJECT_GUIClass ui;

private:
   boost::shared_ptr<PROJECTengine> PROJECTEngine_; 
};

PROJECT.hpp:

#include <QtCore/qobject.h>
#include "ui_PROJECT_gui.h"

namespace PROJECT {
class PROJECTengine : public QObject {
   Q_OBJECT
public:
   PROJECTengine();

#ifdef _Qt      
   // Gui functions
   void setGui(Ui::PROJECT_GUIClass& ui){
      ui_ = boost::shared_ptr<Ui::PROJECT_GUIClass>(&ui);
   }

   void guiOut(QString text){
      ui_->textBrowserOutput->append(text);
   }
#endif
public slots:
   void createScenarios();

private:
#ifdef _Qt
   // GUI Objects
   QString outputText_;
   boost::shared_ptr<Ui::PROJECT_GUIClass> ui_;
#endif
};

スロットcreateScenariosは、プッシュボタン信号に接続されています。

QObject::connect(ui.toolButtonSzenarienBerechnen, SIGNAL(clicked()),  &*PROJECTEngine_, SLOT(createScenarios()));

createScenarios()メソッドは次のようになります。

void PROJECTengine::createScenarios(){
   Step1: some code doing a lot of time consuming stuff
#ifdef _Qt
   guiOut("Step 1 ready!");
#endif
  Step2: some code doing a lot of time consuming stuff
#ifdef _Qt
   guiOut("Step 2 ready!");
#endif
  Step3: some code doing a lot of time consuming stuff
#ifdef _Qt
   guiOut("Step 3 ready!");
#endif
}

これはすべてどういうわけかうまくいくようです。ボタンを押すと、createScenarios()が呼び出されます。時間のかかるコード部分はすべて実行され、GUI出力も機能しますが、タイミングが私の問題です。私が欲しいのは、ステップiを完了した後、「ステップiの準備ができました!」というテキストです。私のGUIに表示されます。しかし、これは起こりません。代わりに、すべてのステップが実行され、最後に3つの出力が表示されます。ステップ1準備完了ステップ2準備完了ステップ3準備完了がGUIに一度に表示されます。

私は今のところ完全に無力で、いくつかのことを試みました。最初の試行では、Ui::PROJECT_GUIClassからPROJECTengineクラスへの参照を含めませんでした。代わりに、PROJECTengingeクラスにシグナル「出力」がありました。

signals:
   void output(QString);

これを私のテキストブラウザウィジェットのappendメソッドに接続しました:

QObject::connect(&*PROJECTEngine_, SIGNAL(output(QString)), ui.textBrowserOutput, SLOT(append(QString)));

guiOutを呼び出す代わりに、createscenarios()メソッドで出力シグナルをスローします。これらの方法のいずれかが望ましいかどうかわかりませんか?しかし、結果は上記と同じでした。

私は何が間違っているのですか?

4

2 に答える 2

1

QApplication :: processEvents();を呼び出します。各ステップの後。ui.textBrowserOutput->append()(直接またはシグナルを発行することによって)の各呼び出しがメッセージキューに入れられ、制御を関数に戻すため、この動作が発生します。そのままにしておくと、Qtはキュー内の各メッセージの実行を開始します。QApplication::processEvents();Qtに今すぐ実行するように指示しますが、関数がいつ終了するかは指示しません

于 2013-01-17T15:14:59.630 に答える
0

呼び出しを避けたい場合processEventsは、ボタンをクリックしたスロットの3つのステップごとにシグナルを発することで、アクションをステージングすることもできます。Qt::QueuedConnectionこれらの信号を3つの異なるスロットに接続するときに使用できます。これらの各スロットは、ボタンスロットが終了した後、ステップの1つを実行します。guiOut各スロットであなたに電話してください。これの最終的な結果は、ボタンがクリックされたスロットが、発行された順序で処理される3つの後続のイベントをキューに入れることです。

于 2013-01-17T19:37:15.673 に答える