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% 的增量。等等等等
我的代码包含一个需要花费大量时间来计算的函数。为了让它感觉更灵敏,我想用进度条可视化每十分之一的进度。但是,该功能是在另一个 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% 的增量。等等等等