Qt:如何正确定义此代码的信号参数?

Qt: How to properly define the signal argument for this code?

我在 Ubuntu 14.04 上使用 Qt 4.8。
目前,我有以下代码:

void MyServer::processMessage()
{
   QByteArray data;
   ...

   ...
   emit newMessage(data);
}   

--
定义 newMessage 信号(在头文件中)的正确方法是什么:

signals:
    void newMessage(const QByteArray & newData);

或:

signals:
    void newMessage(QByteArray newData);

如上所示,信号是在退出 processMessage 函数之前发出的,因此 QByteArray data 在发出该信号后将不再存在...
因此,我担心定义信号的第一种方法是它作为参数传递对对象(实例)的引用,该对象(实例)在发出 newMessage 后不再存在。

提前感谢您的时间和耐心等待!
顺便说一句:我的应用程序是单线程的。
PS:如果应用是多线程的,情况会有所不同吗?

如上一个回答'how to pass qobject as argument from signal to slot in qt connect'所述,建议将Object作为指针传递。

所以,信号声明是:

signals:
    void newMessage(QByteArray* newData);

而信号的发射是:

void MyServer::processMessage()
{
   QByteArray data;
   ...

   ...
   emit newMessage(&data);
} 

两者都可以,但最常见的版本是

signals:
    void newMessage(const QByteArray &newData);

关于您对第一个选项的担忧:只能通过 Qt::DirectConnection 传递引用(Qt::AutoConnection 基本上导致单线程 signal/slot 连接),因为其他人要求信号参数可存储在 QVariant 中,而引用则不能。

有了这样的 Qt::DirectConnection,当连接到信号的所有插槽都已执行时,发射将 "return"。 所以在这一点上没有人会需要 data 对象了。