我有一个Qt-GUI类'Widget',我在其中创建了QProgressButton。 'Widget'有类'Engine'的实例。 'Engine'中的函数Start()在大循环中进行许多计算。如何从Engine更新此进度条?我应该使用QThread吗?
答案 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
的函数。正确的方法是将功能定义为插槽,并将信号连接到该插槽,并在您想要调用功能时发出信号。