0

我的代码包含一个需要大量时间来计算的函数。为了让它感觉更灵敏,我想用进度条可视化每十分之一的进度。但是,该功能是在我的 Main Widget 类之外的另一个类中实现的,我无法访问 Widget 类的 ui 元素。我尝试放置一个可以在函数期间发出的信号,但是它作为一个错误出现。相关代码如下所示:

//Class cpp implementation
void Dataset::calculateNew(){

for(int i = 0; i<1000; i++){
     if(i%100==0)
       emit valueChanged(i);  //first Error
        for(int j = 0; j<1000; j++){
            for(int k=0; k<1000; k++){

             //Expensive Matrix calculation
        }
     }
  }
} 
//Class .h implementation

signal:
valueChanged(int value);

//Widget implementation
 
connect(Dataset::calculateNew(), SIGNAL(valueChanged(int)), this, SLOT(updateProgressBar(int))); //second Error here
 

我的想法是否正确?我应该怎么做才能让它工作?或者是否有另一种方法来访问和更改 Widget 类的 ui 元素。

注意:我尝试在 Dataset 类中包含“widget.h”,但它不被识别为要包含的类,

4

2 回答 2

0

没有最小的例子很难说,但我想问题在于你的连接电话:

connect(Dataset::calculateNew(), SIGNAL(valueChanged(int)), this, SLOT(updateProgressBar(int))); //second Error here

如果您的数据集对象被调用ds,它应该如下所示: connect(&ds, SIGNAL(valueChanged(int)), this, SLOT(updateProgressBar(int)));

顺便说一句,您为什么不使用基于功能指针的新信号槽语法?你还在QT4吗?

于 2022-01-13T22:16:14.170 回答
0

不要使用这些旧信号。使用新的

connect(datasetPotr, &Dataset::valueChanged, this,&thisClassObject::updateProgressBar);

此外,这会破坏您的循环性能。因为您将在每个刻度上推送更新并在循环线程中强制重绘。您应该研究更复杂的通知系统......说每 xx 个 int 值通知一次,所以从 0-100 每 10 次执行一次,因此您执行 10% 的增量。等等等等。

于 2022-01-17T09:35:20.340 回答