【问题标题】:qt gui how to get progress from another classqt gui如何从另一个班级获得进步
【发布时间】:2015-01-16 10:57:13
【问题描述】:

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

【问题讨论】:

  • 如果Engine 类做了一些繁重的处理导致GUI 冻结,那么你应该把它移到一个新线程。

标签: c++ multithreading qt


【解决方案1】:

您不必使用多线程。在“Engine”类中创建指针,如下所示:

QProgressBar* ReferenceBar;

您还需要在 'Engine' 类中为该参考创建 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));
}

【讨论】:

    【解决方案2】:

    您应该在堆上创建 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) 信号连接到QProgressBarsetValue(int value) 插槽。

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

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2021-11-18
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多