在Qt应用程序中,信号与槽是实现模块间通信的一种常用方式。但当涉及到跨线程时,需要注意信号与槽之间的形参类型设置。

首先,需要确认形参传递是否会涉及到拷贝构造。我们可以通过验证形参包含qSharedPointer、const自定义类名、QByteArray、QString等类型来验证这一点。

接下来,我们可以通过以下示例代码来演示跨线程信号与槽的形参类型设置:

// 在线程1中定义一个信号
class Thread1 : public QObject
{
    Q_OBJECT
signals:
    void signal1(const QString& str);
};

// 在线程2中定义一个槽
class Thread2 : public QObject
{
    Q_OBJECT
public slots:
    void slot1(const QString& str)
    {
        qDebug() << "Received string in slot: " << str;
    }
};

// 在主线程中连接信号和槽,并启动线程2
Thread1 thread1;
Thread2 thread2;
QObject::connect(&thread1, &Thread1::signal1, &thread2, &Thread2::slot1, Qt::QueuedConnection);
QThread* t = new QThread;
thread2.moveToThread(t);
t->start();

// 在线程1中发送信号
emit thread1.signal1("Hello from Thread1!");

在这个示例中,我们使用了Qt的QueuedConnection来确保信号和槽在不同线程间进行通信。并且,由于我们在信号中使用了const QString&类型的形参,所以在跨线程传递时会进行隐式共享,避免了拷贝构造。

通过合理的形参类型设置,我们可以实现跨线程信号与槽的高效通信。