QMetaObject::invokeMethod 不调用槽
Posted
技术标签:
【中文标题】QMetaObject::invokeMethod 不调用槽【英文标题】:QMetaObject::invokeMethod does not call slot 【发布时间】:2021-07-11 23:15:09 【问题描述】:我在工作区管理器类中有一个名为 UpdateScreenshots 的公共信号,它可以截取一些小部件的屏幕截图。然后它在我定义的结构中返回这些屏幕截图。这个调用是从一个线程进行的,因为截屏显然只能在主线程上完成。但是,此 invokemethod 调用不起作用,并且未调用 updatescreenshots 插槽。我可能做错了什么? 有没有更好的方法来做到这一点?
invokeMethod 调用
VmsWorkspaceManager::InfoStruct info;
QMetaObject::invokeMethod(m_Manager, "UpdateScreenshots", Qt::BlockingQueuedConnection,
Q_RETURN_ARG(Vms::GuiWidgets::VmsWorkspaceManager::InfoStruct, info));
槽的定义;
public slots:
/**
* \brief Updates the current screenshots to be sent to a remote client
*/
InfoStruct UpdateScreenshots() const;
【问题讨论】:
【参考方案1】:首先,确保您在 InfoStruct
标头的底部有此声明:
Q_DECLARE_METATYPE(Vms::GuiWidgets::VmsWorkspaceManager::InfoStruct)
然后,在您的 main
函数之上,进行以下调用:
int main(int argc, char *argv[])
qRegisterMetaType<Vms::GuiWidgets::VmsWorkspaceManager::InfoStruct>("Vms::GuiWidgets::VmsWorkspaceManager::InfoStruct");
由于您使用的是命名空间,因此您必须与它们非常保持一致,因此请确保槽签名是这样的:
Vms::GuiWidgets::VmsWorkspaceManager::InfoStruct UpdateScreenshots() const;
【讨论】:
以上是关于QMetaObject::invokeMethod 不调用槽的主要内容,如果未能解决你的问题,请参考以下文章
为啥从线程执行方法时使用 QMetaObject::invokeMethod
如果我从线程调用 QMetaObject::invokeMethod 到单音,调用是不是仍在该 qthread 中?