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)));
答
我认为这应该工作:
QObject::connect(classA.get(), SIGNAL(posChanged(int, int)), this, SLOT(posChanged(int, int)));
但是,使用std :: shared_ptr的对Qt的所有权是不是在Qt的“正常”的方式,并可能导致问题后来。如果你需要一个对象来“拥有”另一个对象,那么最好使用Qt的parenting mechanism
这真的有用吗?当shared_ptr没有计算这个对象的任何引用时,不会获取由classA.get()返回的对象吗? – Soccertrash 2017-07-26 19:01:33