【问题标题】:How to pass a reference as a Signal instead of an object如何将引用作为信号而不是对象传递
【发布时间】:2013-06-18 16:55:21
【问题描述】:

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

这是我将它作为对象传递的方式(可行)

插槽:

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 参数替换插槽,但是插槽永远不会被调用。

【问题讨论】:

标签: c++ qt


【解决方案1】:

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

信号和槽的方法签名必须匹配,所以如果槽需要引用类型,那么信号也必须匹配:

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

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

emit QTUpdateEmployee(objectValue);

【讨论】:

    【解决方案2】:

    发出引用(或指针)的问题在于被引用对象的生命周期。如果连接已排队(不是由发送方决定),则在执行连接的插槽之前,引用可能会变为无效。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2018-08-17
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多