首页 > 解决方案 > QMetaObject::invokeMethod 不调用槽

问题描述

我在workspacemanager 类中有一个名为UpdateScreenshots 的公共信号,用于截取一些小部件的屏幕截图。然后它在我定义的结构中返回这些屏幕截图。这个调用是从一个线程进行的,因为截屏显然只能在主线程上完成。但是,此 invokemethod 调用不起作用,并且未调用 updatescreenshots 插槽。我可能做错了什么?有一个更好的方法吗?

调用方法调用

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;

标签: c++multithreadingqtqmetaobject

解决方案


首先,确保在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;

推荐阅读