【发布时间】:2019-10-08 11:40:27
【问题描述】:
我想更新许多对象。我可以选择使用传统的 loop,例如:
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);
}
- 我已经测试了 loop 方法并且它有效。
- 我正在考虑signal-slot机制,也许它对复杂代码有一些好处。
- 我想知道应该怎么做或者有更好的方法?
写完我的问题后,我发现this post 确实很有帮助,但我不确定它是否与我的问题直接相关。
【问题讨论】:
-
IMO 第一种方法更好:1)更简单,2)避免类之间的循环依赖。
-
没有人问有多少
items()。update(factor)实际上做了什么(例如,它是一个复杂的操作)?这是在 GUI 线程中运行的吗?如果没有更多细节,这在我看来很像一个意见问题。 -
@MaximPaperno 感谢您提到信号槽方法在 GUI 响应性方面的好处。
-
我认为这个问题中提供的两个答案在一般意义上都可能有用:stackoverflow.com/questions/37919309/…
标签: c++ qt loops signals-slots