c++ - 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;
解决方案
首先,确保在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;
推荐阅读
- r - frank() 在 R 中形成多列
- c++ - GCC 插件:是否可以将一个函数的基本块序列移动到另一个函数的基本块?
- android - 无法获取范围组件的相同实例 - Dagger 2 Clean 架构
- c# - ''Y' 和 'Y' C# 之间的区别
- java - Android Studio 登录功能与数据库参考
- jsf - java.lang.ClassNotFoundException:org.primefaces.model.chart.ChartSeries
- grails - 数据库查询的空检查groovy方式结果
- latex - 如何在 Latex 表中标题特定数量的列?
- macos - 使用绑定和结构时自定义 nspopupbutton 标题
- php - 嗨,我在 Laravel 中更新图像时收到“对布尔成员函数 update() 的错误调用”