如何将引用作为Signal而不是对象传递

时间:2013-06-18 16:55:21

标签: c++ qt

目前我可以通过信号将对象传递给插槽。 但是,我无法通过相同的信号传递相同的对象作为对插槽的引用

以下是我如何将其作为对象传递(这有效)

插槽:

void SomMethod(A::Employee hcol);

声明和注册:

Q_DECLARE_METATYPE(A::Employee);
qRegisterMetaType<A::Employee>();

信号连接

connect(this,SIGNAL(QTUpdateEmployee(A::Employee)),ptrForm,SLOT(EmployeeUpdates(A::Employee)));

现在我无法将Employee作为参考传递任何关于我应该尝试的建议。我尝试用Reference参数替换插槽然后插槽永远不会被调用。

2 个答案:

答案 0 :(得分:2)

您提到使用引用类型而不是显示的值类型替换插槽中的参数,但您没有提及更改信号参数类型。

信号和插槽的方法签名必须匹配,因此如果插槽需要参考类型,那么信号也必须:

connect(this, SIGNAL(QTUpdateEmployee(A::Employee&)), ptrForm, SLOT(EmployeeUpdates(A::Employee&)));

但是当将对象传递给信号时,您仍然可以像通常的方法一样传递它:

emit QTUpdateEmployee(objectValue);

答案 1 :(得分:0)

发出引用(或指针)的问题是引用对象的生命周期。如果连接排队(发件人未决定),则在执行连接的插槽之前,引用可能无效。

如果你能忍受这种“危险”,你可以在签名中使用指针。应该考虑智能指针。如果你不使用智能指针,你至少应该记录(写在注释中)指针有效的时间长度(例如,直到发送者死亡)。