我是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()方法中抛出输出信号。不知道其中一种方式是否更可取?但结果与上述相同。
我做错了什么?
答案 0 :(得分:1)
每个步骤后调用QApplication::processEvents();。
您有这种行为,因为ui.textBrowserOutput->append()
的每次调用(无关紧要或通过发出信号)都会放入消息队列并将控件返回给您的函数。当你离开时,Qt开始执行队列中的每条消息。 QApplication::processEvents();
告诉Qt现在就这样做,但不是在你的功能结束时
答案 1 :(得分:0)
如果您想避免拨打processEvents
,您还可以通过为按钮点击的插槽中的3个步骤中的每个步骤发出信号来暂停您的操作。将这些信号连接到3个不同的插槽时,可以使用Qt::QueuedConnection
。每个插槽都会在按钮插槽退出后执行您的一个步骤。在每个广告位中拨打guiOut
。最终结果是按下单击的按钮排队3个后续事件,按照发出的顺序处理。