2014-11-23 135 views
0

我有兩個類。爲了簡單起見,我會稱它們爲A級和B級。我希望使用Qt Signals and Slots進行鏈接,當類A的函數setXPos()setYPos()被調用到類B時,它在特定位置上顯示圖像以便圖像cna移動到正確的座標。這裏是我的代碼:Qt將信號連接到插槽

class A: public QObject 
{ 
    Q_OBJECT 
public: 
    A(); 
    void setXPos(int newPos) {xPos = newPos; emit posChanged(xPos, yPos);}; 
    void setYPos(int newPos) {yPos = newPos; emit posChanged(xPos, yPos);}; 

signals: 
    void posChanged(int x, int y); 

private: 
    int xPos; 
    int yPos; 
}; 


class B : public QObject 
{ 
    Q_OBJECT 

public: 
    B(std::shared_ptr<A> classA); 
    void changePos(int x, int y); 

public slots: 
    void posChanged(int x, int y); 

private: 
    QPixmap image; 
    std::shared_ptr<A> classA; 
}; 

所以在我B對象我想趕上posChanged()的EMIT中A類。您可以在B的構造函數中看到指向A的指針,該指針存儲在類B中。因此,在構造函數中我想做的事:

B::B(std::shared_ptr<A> classA) : classA(classA) 
{ 
    QObject::connect(classA, SIGNAL(posChanged(int x, int y)), *this, SLOT(posChanged(int x, int y))); 
} 

但有我我connect內部通話不匹配功能這給了錯誤。

回答

2

不能在連接中使用參數,只能使用類型。所以下次嘗試:

QObject::connect(classA.get(), SIGNAL(posChanged(int, int)), this, SLOT(posChanged(int, int))); 
+0

這真的有用嗎?當shared_ptr沒有計算這個對象的任何引用時,不會獲取由classA.get()返回的對象嗎? – Soccertrash 2017-07-26 19:01:33

4

我認爲這應該工作:

QObject::connect(classA.get(), SIGNAL(posChanged(int, int)), this, SLOT(posChanged(int, int))); 

但是,使用std :: shared_ptr的對Qt的所有權是不是在Qt的「正常」的方式,並可能導致問題後來。如果你需要一個對象來「擁有」另一個對象,那麼最好使用Qt的parenting mechanism