2017-06-17 158 views
1

我進入了接收信號之後必須調用對象時隙的情況(只是將信號轉發到另一個對象時隙)。我知道我可以簡單地實現插槽並從身體調用另一個插槽,但是也許我可以以更簡單的方式做到這一點?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

您可以將信號連接到兩個插槽,並按照連接它們的順序調用它們。

+0

謝謝,但看看編輯 – jaskmar

0
  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(); 
}; 
  • 在您的代碼連接到processText信號,但你的類SomeController沒有任何信號
  • +0

    謝謝,但看看編輯 – jaskmar

    0

    如所建議的通過ctinka,定義SomeController::processText作爲一個信號是正確的解決方案。

    它在Qt Signals & Slots documentation明確指出,你可將信號連接到另一個信號:

    到信號直接連接到其他信號甚至可能。 (這將發射第二信號立即每當第一是 射出。)

    進一步考慮

    注意,時隙是正常的C++函數,所以Qt是不能夠執行任何特殊的邏輯(像調用連接的插槽):

    插槽是正常的C++函數,可以正常調用;他們唯一的 特殊功能是信號可以連接到他們。

    在另一方面,被Qt(moc)產生的信號,並因此是能夠調用連接槽:

    的信號由MOC自動生成,並且必須不能在實現 。 cpp文件。