Qt转发插槽/连接插槽到插槽?

时间:2017-06-17 11:10:50

标签: c++ qt signals-slots

我遇到的情况是我必须在接收信号后调用对象的插槽(只需将信号转发到另一个对象插槽)。我知道我可以简单地实现插槽并从主体调用另一个插槽,但也许我可以用更简单的方式做到这一点?

以下是示例代码:

class SomeWidget : public QObject
{
    Q_OBJECT
signals:
    textChanged(QString);
    //...
};

//----------------------------------------------------------------------

class SomeController : public QObject
{
    Q_OBJECT
public slots:
    processText(QString);
    //...

public:
    SomeController()
    {
        connect(this, &SomeController::processText, &someUtil, &SomeUtil::processText);
        //^^ this won't work, linker can not find SomeController::processText
    }
private:
    SomeUtil someUtil; //doesn't matter, just does something
};

//----------------------------------------------------------------------

//code somewhere else
connect (someWidget, &SomeWidget::textChanged, someController, &SomeController::processText)

修改

好吧,也许我的问题不够明确 - 请说明我的例子 - 我不想直接SomeWidgetSomeUtil联系,因为我想要隐藏我甚至使用{{{ 1}}。对于SomeUtil用户,此类应该是不可见的。这是一个封装问题。 SomeController是一种外观。

更重要的是,我不需要实施SomeController的广告位。唯一的工作就是拨打SomeController的广告位(转发信号)。

3 个答案:

答案 0 :(得分:0)

您可以将信号连接到两个插槽,然后按照连接顺序调用它们。

答案 1 :(得分:0)

  1. 回答你的问题:你可以逐个建立两个连接,并按相同的顺序调用插槽

    之类的东西
    connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::processText);
    connect(someWidget, &SomeWidget::textChanged, anotherController, &SomeController::processText);
    
  2. 如果您需要调用多个插槽,这非常有用:

    connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::processText);
    connect(someWidget, &SomeWidget::textChanged, someController, &SomeController::update);
    

    但是如果你需要调用同一个类的私有成员函数 - 你需要创建包装器插槽:

    class SomeController : public QObject
    {
        Q_OBJECT
    public slots:
        void processText(QString);
        {
            foo();
            bar();
        }
    private:
        void foo();
        void bar();
    };
    
    1. 在您的代码中连接到processText信号,但您的类SomeController没有任何信号

答案 2 :(得分:0)

正如ctinka所建议的那样,将SomeController::processText定义为信号是正确的解决方案。

Qt Signals & Slots documentation中明确指出,您可以将信号连接到另一个信号:

  

甚至可以将信号直接连接到另一个信号。   (每当第一个信号发出时,它会立即发出第二个信号   发射。)

进一步考虑

请注意,插槽是普通的C ++函数,因此Qt无法执行任何特殊逻辑(如调用连接的插槽):

  

插槽是普通的C ++函数,可以正常调用;他们唯一的   特殊功能是信号可以连接到它们。

另一方面,信号由Qt(moc)生成,因此可以调用连接的插槽:

  

信号由moc自动生成,不得为   在.cpp文件中实现。