Qt C++,将 class 实例信号连接到 Widget main class

Qt C++, connect class instance signal to Widget main class

我的代码包含一个需要花费大量时间来计算的函数。为了让它感觉更灵敏,我想用进度条可视化每十分之一的进度。但是,该功能是在另一个 class 中实现的,而不是我的主小部件 class,我无法访问小部件 class 的 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
 

我的思考方式正确吗?我应该怎么做才能让它发挥作用?或者是否有另一种方法来访问和更改 ui 小部件的元素 class.

注意: 我尝试在数据集 class 中包含“widget.h”,但它未被识别为要包含的 class,

如果没有最小的例子很难说,但我猜问题出在你的连接调用上:

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

假设您的数据集对象名为 ds,它应该如下所示: connect(&ds, SIGNAL(valueChanged(int)), this, SLOT(updateProgressBar(int)));

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

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

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

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