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

问题描述:

我进入了接收信号之后必须调用对象时隙的情况(只是将信号转发到另一个对象时隙)。我知道我可以简单地实现插槽并从身体调用另一个插槽,但是也许我可以以更简单的方式做到这一点?Qt转发插槽/连接插槽到插槽?

这里的示例代码:

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) 

编辑:

好吧,也许我的问题是不够清晰 - concidering我的例子 - 我不想与SomeUtil我直接SomeWidget连接想要隐藏我甚至使用SomeUtil的事实。对于SomeController的用户,此类应该是不可见的。这是一个封装问题。 SomeController是一种外观。

什么是我不需要执行SomeController的插槽。唯一的工作是拨打SomeUtil的插槽(转发信号)。

+1

你可以在SomeController类中声明的信号,信号的相互连接,当小部件会发出信号框TextChanged - 控制器会发出processText信号过 – ctinka

+0

@ctinka的确,我可以,但我不认为这是一个不错的解。信号被认为是“说话”而不是“听”的功能。 – jaskmar

+0

在Qt库它可以连接到另一个信号 – ctinka

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

+0

谢谢,但看看编辑 – jaskmar

  1. 回答你的问题:你可以使两个连接一个接一个和槽会以相同的顺序被称为 像

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

,如果你需要,这是有益的调用多个插槽:

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

,但如果你需要调用同一类的私有成员函数 - 您甲肾上腺素ED使包装槽:

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

谢谢,但看看编辑 – jaskmar

如所建议的通过ctinka,定义SomeController::processText作为一个信号是正确的解决方案。

它在Qt Signals & Slots documentation明确指出,你可将信号连接到另一个信号:

到信号直接连接到其他信号甚至可能。 (这将发射第二信号立即每当第一是 射出。)

进一步考虑

注意,时隙是正常的C++函数,所以Qt是不能够执行任何特殊的逻辑(像调用连接的插槽):

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

在另一方面,被Qt(moc)产生的信号,并因此是能够调用连接槽:

的信号由MOC自动生成,并且必须不能在实现 。 cpp文件。