我想更新多个对象。我可以通过传统的循环来实现:
void ParentClass::updateItems(const float factor)
{
for (Item *item : items()) {
item->update(factor)
}
}
...或者我可以使用信号槽(signal-slot)机制来实现:
class ParentClass : public QObject
{
Q_OBJECT
Q_SIGNALS:
// The signal which will be emitted by parent:
void updateNeeded(const float factor);
private:
void updateItems(const float factor);
}
// Signal is emitted here
void ParentClass::updateItems(const float factor)
{
emit updateNeeded(factor);
}
class Item : public QObject
{
Q_OBJECT
Item(ParentClass *parent) : QObject()
, m_parent(parent)
{
// Connect parent signal to each item slot at each item constructor
QObject::connect(m_parent, &ParentClass::UpdateNeeded,
this, &Item::handleUpdate);
}
public Q_SLOTS:
void handleUpdate(const float factor);
private:
ParentClass *m_parent;
}
// The slot which handles emitted signal:
void Item::handleUpdate(const float factor)
{
this->update(factor);
}
- 我已经测试了循环的方法,它可以工作。
- 我正在考虑使用信号槽机制,也许对于复杂的代码有一些好处。
- 我想知道哪种方法是应该这样做的,或者是否有更好的方法?
在写完我的问题后,我发现这篇文章非常有帮助,但我不确定它是否与我的问题直接相关。
items()
。update(factor)
实际上是做什么的(例如,它是一个复杂的操作吗)? 这是否在GUI线程中运行? 没有更多细节,这看起来很像是一个观点问题。 - Maxim Paperno