插槽功能结束后出现Qt小部件操作

时间:2013-01-17 15:00:13

标签: qt

我是Qt的新手,以下问题让我发疯。我想有一个简单的解决方案,但到目前为止,我没有成功与谷歌等。

我有一个完成的控制台应用程序,我的目标是为此应用程序添加一个gui。我正在使用VS2010 Ultimate并且包含了Qt添加。然后我创建了一个Qt项目并包含了第二个项目,包括我的应用程序。结构如下所示:

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之后,我将准备“Step i ready!”显示在我的gui中。但这不会发生。而是执行所有步骤,最后执行三个输出: 第1步准备好了 第2步准备好了 第3步准备好了 立即显示在我的gui中。

我现在完全无助并尝试了几件事。在第一次试验中,我没有在PROJECTengine类中包含我的Ui :: PROJECT_GUIClass的引用。相反,我在PROJECTenginge类中有一个信号“output”:

signals:
   void output(QString);

并将其连接到我的textbrowser小部件的append方法:

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

我没有调用guiOut而是在createscenarios()方法中抛出输出信号。不知道其中一种方式是否更可取?但结果与上述相同。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

每个步骤后调用QApplication::processEvents();。 您有这种行为,因为ui.textBrowserOutput->append()的每次调用(无关紧要或通过发出信号)都会放入消息队列并将控件返回给您的函数。当你离开时,Qt开始执行队列中的每条消息。 QApplication::processEvents();告诉Qt现在就这样做,但不是在你的功能结束时

答案 1 :(得分:0)

如果您想避免拨打processEvents,您还可以通过为按钮点击的插槽中的3个步骤中的每个步骤发出信号来暂停您的操作。将这些信号连接到3个不同的插槽时,可以使用Qt::QueuedConnection。每个插槽都会在按钮插槽退出后执行您的一个步骤。在每个广告位中拨打guiOut。最终结果是按下单击的按钮排队3个后续事件,按照发出的顺序处理。