Qt moveToThread,带参数的信号/插槽

鲍里斯 L。

我尝试将https://wiki.qt.io/QThreads_general_usage 中的一种方法与 moveToThread 结合使用。一切安好。但是如果我尝试将参数添加到完成的信号中,则会出现以下问题:

class Worker : public QObject {
Q_OBJECT
public:
   Worker();
   ~Worker();
public slots:
   void process();
signals:
   void finished(const std::string& value);
};

void Worker::process() { // Process. Start processing data.
    // allocate resources using new here
    qDebug("Hello World!");
    std::string s = someFunctionReturningString(); 
    emit finished(s);
}

主要类是:

class Main: public QObject {
Q_OBJECT
public:
    void startProgram();
public slots:
   void slotFinished(const std::string& s);
};

void Main::startProgram() {
   QThread* thread = new QThread;
   Worker* worker = new Worker();
   worker->moveToThread(thread);
   connect(thread, &QThread::started, worker, &Worker::process);
   connect(worker, &Worker::finished, thread, &QThread::quit);
   connect(worker, &Worker::finished, worker, &Worker::deleteLater);
   connect(worker, &Worker::finished, this,   &Main::slotFinished);
   connect(thread, &QThread::finished, thread, &QThread::deleteLater);
   thread->start();
}

void Main::slotFinished(const std::string& value) {
    qDebug() << "result " << value.c_str();
}

如果我将这个完成的信号连接到某个插槽(slotFinished),我就没有收到这个插槽的调用。

这是信号/插槽/moveToThread 的预期行为吗?

马雷克

问题是元数据信息。

当您在信号和槽之间进行默认连接并且当信号从分配给接收器的不同线程发出时,Qt 会执行魔术并包装信号的参数(创建副本)并将它们排在目标线程的事件循环中。

然后当目标线程执行 Qt 事件循环的逻辑时,值被解包,并使用复制的值调用相应的插槽。

现在为了能够进行这个复制,Qt 必须对这种类型有一些基本的了解。因此,当您使用 Qt 类型时,它将开箱即用,但是您使用外部类型(例如std::string在您的情况下),您必须首先执行类型注册。

所以基本上你的代码缺少这样的东西:

// to be declared somewhere
Q_DECLARE_METATYPE(std::string);

// to be invoked at the beginning of program
qRegisterMetaType<std::string>();

如果没有类型注册,Qt 不知道如何进行复制并在日志中提供警告。检查 Qt 日志我确定它会提示您正确的错误消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在moveToThread()之后未调用Qt 4.8信号/插槽

来自分类Dev

Qt信号/插槽问题

来自分类Dev

带参数的QT信号如何工作

来自分类Dev

通过QT的信号/插槽系统传递通用异常作为参数

来自分类Dev

Qt信号和插槽:权限

来自分类Dev

Qt插槽和信号语法

来自分类Dev

Qt信号和插槽故障

来自分类Dev

Qt moveToThread:对象带什么资源?

来自分类Dev

信号和插槽 qt 关闭插槽

来自分类Dev

Qt信号插槽:发送信号但未调用插槽

来自分类Dev

QT5中的信号和插槽

来自分类Dev

Qt:连接文本中的信号和插槽

来自分类Dev

Qt信号和插槽传递数据

来自分类Dev

Qt转发信号/插槽连接

来自分类Dev

在QT中清除信号和插槽的命名

来自分类Dev

Qt将信号连接到插槽

来自分类Dev

Qt QLed信号插槽如何连接?

来自分类Dev

Qt-2类信号和插槽

来自分类Dev

在非Qt线程中使用Qt信号/插槽

来自分类Dev

Qt插槽和信号。获取插槽接收器对象

来自分类Dev

Qt:从一个物体发出相同的信号,但是带有不同的参数;插槽根据收到的参数进行区分

来自分类Dev

直接调用函数与发出信号(Qt-信号和插槽)

来自分类Dev

Qt插槽和信号未连接:无此信号

来自分类Dev

将参数放在Qt中的插槽中

来自分类Dev

为什么我的Qt信号/插槽断点没有命中?(信号/插槽)

来自分类Dev

信号和插槽编辑按钮被禁用(Qt Designer 4.8)

来自分类Dev

如何在Qt中创建动态信号和插槽?

来自分类Dev

使用Qt信号和插槽与直接调用方法

来自分类Dev

Qt线程上的信号插槽,这是安全的方法吗?