在信号时隙机制与传统环路之间做出决定

时间:2019-10-08 11:40:27

标签: c++ qt loops signals-slots

我想更新许多对象。我可以选择使用传统的循环来做到这一点,例如:


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);
}

  1. 我已经测试了 loop 方法,该方法有效。
  2. 我正在考虑 signal-slot 机制,也许它对复杂代码有一些好处。
  3. 我想知道应该采用哪种方法,还是有更好的方法?

在写完问题后,我发现this post确实很有帮助,但是我不确定它是否与我的问题直接相关。

1 个答案:

答案 0 :(得分:2)

KISS随时随地使用基于循环的方法

signal-slot 是一种非常松散耦合的接口方法-尽管有时这种方法很棒(大多数情况下,当其他选项无法实现时..),它的脆性更大。 em>而不是常规函数调用。