我想更新许多对象。我可以选择使用传统的循环来做到这一点,例如:
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);
}
在写完问题后,我发现this post确实很有帮助,但是我不确定它是否与我的问题直接相关。
答案 0 :(得分:2)
KISS随时随地使用基于循环的方法
signal-slot 是一种非常松散耦合的接口方法-尽管有时这种方法很棒(大多数情况下,当其他选项无法实现时..),它的脆性更大。 em>而不是常规函数调用。