0

我是 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() 方法中抛出了一个输出信号。不知道这些方法中的一种是否更可取?但结果和上面一样。

我究竟做错了什么?

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 个不同的插槽时,您可以使用。这些插槽中的每一个都将在按钮插槽退出后执行您的步骤之一。guiOut在每个插槽中调用您的。这样做的最终结果是您的按钮单击插槽队列 3 个后续事件,这些事件按照它们发出的顺序进行处理。

于 2013-01-17T19:37:15.673 回答