私は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()メソッドで出力シグナルをスローします。これらの方法のいずれかが望ましいかどうかわかりませんか?しかし、結果は上記と同じでした。
私は何が間違っているのですか?