Qt将信号连接到插槽

Qt将信号连接到插槽

问题描述:

我有两个类。为了简单起见,我会称它们为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内部通话不匹配功能这给了错误。

不能在连接中使用参数,只能使用类型。所以下次尝试:

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

我认为这应该工作:

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

但是,使用std :: shared_ptr的对Qt的所有权是不是在Qt的“正常”的方式,并可能导致问题后来。如果你需要一个对象来“拥有”另一个对象,那么最好使用Qt的parenting mechanism