qt gui如何从另一个班级获得进步

时间:2015-01-16 10:57:14

标签: c++ multithreading qt

我有一个Qt-GUI类'Widget',我在其中创建了QProgressButton。 'Widget'有类'Engine'的实例。 'Engine'中的函数Start()在大循环中进行许多计算。如何从Engine更新此进度条?我应该使用QThread吗?

2 个答案:

答案 0 :(得分:0)

您不必使用多线程。在“引擎”中制作指针类,这样:

QProgressBar* ReferenceBar;

您还需要在课堂上创建setter'引擎'供参考:

void setBar(QProgressBar* bar){
     ReferenceBar = bar;
}

在GUI中,您必须直接设置进度条:

instanceOfEngine = new Engine();
...
instanceOfEngine->setBar(progressBar);

并激活更新“引擎”中的栏。循环:

Start(){
...
for(int i=0; i < x; i++){
     //computing....
     ReferenceBar->setValue(100*i/(x-1));
}

答案 1 :(得分:0)

您应该在堆上创建类Engine的对象并将其移动到新线程,以防止它阻塞主线程和UI。

这可以这样做:

engine = new Engine();
QThread * th = new QThread();
engine->moveToThread(th);

QObject::connect(th,SIGNAL(started()),engine,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),engine,SLOT(OnFinished()));

th->start();

班级Engine中的初始化和终止任务应分别在OnStarted()OnFinished()个广告位中完成。

您应该使用班级Engine中的信号通知用户界面中的进度条,了解进度值。您可以在包含循环的函数中以适当的值发出信号,也可以在特定的时间间隔内以定时器的形式发出信号。后者更好,因为如果过于频繁地重复循环,它会阻止过多地发出信号。

信号如下:

void progressChanged(int val);

您还应该将progressChanged(int)信号连接到setValue(int value)的{​​{1}}位置。

最后一点是,当它在另一个线程中时,你不应该直接调用QProgressBar的函数。正确的方法是将功能定义为插槽,并将信号连接到该插槽,并在您想要调用功能时发出信号。