我是 Qt 的新手,下面的问题让我抓狂。我想有一个简单的解决方案,但到目前为止我在谷歌等方面没有成功。
我有一个完成的控制台应用程序,我的目标是为这个应用程序添加一个 gui。我正在使用 VS2010 Ultimate 并包含 Qt 插件。然后我创建了一个 Qt 项目并包含了第二个项目,其中包括我的应用程序。结构如下所示:
主.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_;
};
项目.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 中。但这不会发生。相反,所有步骤都被执行,最后三个输出: 步骤 1 就绪 步骤 2 就绪 步骤 3 就绪 立即显示在我的 gui 中。
我现在完全无助,尝试了几件事。在第一次试验中,我没有将我的 Ui::PROJECT_GUIClass 引用包含到 PROJECTengine 类中。相反,我在 PROJECTenginge 类中有一个信号“输出”:
signals:
void output(QString);
并将其连接到我的 textbrowser 小部件的 append 方法:
QObject::connect(&*PROJECTEngine_, SIGNAL(output(QString)), ui.textBrowserOutput, SLOT(append(QString)));
我没有调用 guiOut,而是在 createcenarios() 方法中抛出了一个输出信号。不知道这些方法中的一种是否更可取?但结果和上面一样。
我究竟做错了什么?