Qt将信号连接到插槽

时间:2014-11-23 17:17:48

标签: c++ qt signals-slots

我有两节课。为简单起见,我将其称为A类和B类。我希望在调用类setXPos()的函数setYPos()A时使用Qt Signals and Slots进行链接类B,在特定位置显示图像,以便图像cna移动到正确的坐标。这是我的代码:

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()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 个答案:

答案 0 :(得分:4)

我相信这应该有效:

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

但是,在Qt中使用std :: shared_ptr来获取所有权并不是&#34;正常&#34;在Qt中的方式,可能会在以后引起问题。如果你需要一个对象来拥有&#34;另外,最好使用Qt&#39; parenting mechanism

答案 1 :(得分:2)

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

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