Qt Signal/Slots 发送完整结构

2024-04-18

我正在尝试通过两个线程之间的信号/槽发送一个结构,我的信号/槽已正确连接,并且我已经能够发送包含部分数据的 QString,但现在我需要发送整个数据,而结构似乎是最明智的。但是,当我尝试时,信号未发送/接收。问题似乎仅与发送/接收结构、前后处理有关,我尝试了很多方法。

我不能使用这样的指针here https://stackoverflow.com/questions/19397567/using-structure-s-signal-in-qt or here https://stackoverflow.com/questions/15567838/signal-emitting-a-structure因为我的数据生成得太快并且内存被覆盖或释放(我尝试过使用指针并假设引用也会受到类似的影响)。

我已经添加了Q_DECLARE_METATYPE http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE到我的结构。我的结构现在只是一个小测试(稍后会放大)并且位于它自己的头文件中。

#ifndef RETURNSTRUCT_H
#define RETURNSTRUCT_H

struct Datastruct
{
    int markeridone;
};

Q_DECLARE_METATYPE(Datastruct);

#endif //RETURNSTRUCT_H

为什么我的程序无法发送/接收结构?任何帮助深表感谢。

我使用的是 Windows 7、MinGW 32 位、Qt 5.7.0、Qt Creator 4.0.3


你的调试日志应该警告你——你只能发送 qt 元系统已知的类型。使用 Q_REGISTER_METATYPE 您最终会注册与进行定义的名称空间关联的类型。

幸运的是,您可以像这样告诉 Qt 您的结构:

// after QApplication was instantiated
qRegisterMetaType<Datastruct>("Datastruct");
// but before any class is instantiated that connects signals with this type

并且它不会尝试通过查看代码来推断名称空间。确保重新运行 qmake(或者最好进行清理),否则在使用 QtCreator 构建时可能会被忽略。

如果您稍后碰巧通过信号传递您类型的模板类,请确保也注册它们,因为即使 Qt 知道 QList,它也不知道您类型的 QList:

qRegisterMetaType<QList<Datastruct>>("QList<Datastruct>");

另请注意:如果您 #define 类别名,请确保使用真实姓名注册它们。

#define std::shared_ptr model_ptr
// you can declare your signals like this:
void my_signal(model_ptr<my_model>);
// but have to register the type like this:
qRegisterMetaType<std::shared_ptr<my_model>>("std::shared_ptr<my_model>");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt Signal/Slots 发送完整结构 的相关文章

随机推荐

  • 使用给定的 DateTime 对象获取一个月的第一天和最后一天

    我想获取给定日期所在月份的第一天和最后一天 该日期来自 UI 字段中的值 如果我使用时间选择器我可以说 var maxDay dtpAttendance MaxDate Day 但我试图从 DateTime 对象中获取它 所以如果我有这个
  • 更改 Android 上活动动画的 z 顺序

    有没有办法反转活动动画的 z 顺序 基本上 当您启动新活动时 它会被添加到后台堆栈 并且其窗口会添加到前一个活动的窗口上 有时稍后返回时 从后台堆栈获取的活动会在顶部活动下方显示其窗口 大多数时候这是完全有道理的 但我对这种行为有以下问题
  • 如何解决SBT依赖的依赖冲突?

    我有一个项目的构建 sbt正在使用 libraryDependencies Seq com lerestau killer launcher 1 0 2 com lerestau menu starter 1 0 0 菜单启动器过渡下载 杀
  • JavaFX检测同时按下的多个键盘按键

    正如标题所说 我想检测同时按下的多个键盘按键 同时地 并被按下 同时地 一段时间 我正在尝试添加多个事件处理程序Scene但它不起作用 EventHandler
  • MySQL如何获取不是我好友的用户

    有人可以帮助我吗 我需要吸引不是我朋友的用户 我有以下表格 users id user 1 Name1 2 name2 和桌子friends id id user id friends 1 2 3 2 5 4 我尝试类似的操作 但在某些查询
  • 全文索引和复合索引以及它们如何影响查询

    只是说我有一个查询如下 SELECT name category address city state FROM table WHERE MATCH name subcategory category tag1 AGAINST educat
  • 与断言相比,scala 中的假设有何含义?

    Scala 似乎定义了 3 种断言 assert require and assume 据我所知 差异 与通用断言相比 require它是专门用于检查输入 参数 传入消息等 的 是什么意思assume then 如果你看一下代码Predef
  • 关闭 WPF 中 Frame 内的页面

    我有一个窗口和一个框架 在该框架中 我打开了许多页面 我想通过单击 关闭 按钮关闭这些页面 问题是页面看不到我的框架我尝试在页面方法中的事件中编写关闭按钮 在主窗口中执行另一个事件 因为在主窗口上很容易看到框架 但它不起作用 这是我在页面中
  • Bootstrap 输入组插件未内联

    这是我的代码 http www bootply com iR1SvOyEGH http www bootply com iR1SvOyEGH
  • SwiftUI 中的圆角边框

    如何在 SwiftUI 中圆化边框 我认为这会起作用 cornerRadius 10 border Color white 但它不起作用 这是我现在的解决方法 overlay RoundedRectangle cornerRadius 10
  • 限制特定组的 Firebase 数据库和存储写入访问权限

    我有一个带有内容管理端的 React Redux Firebase 应用程序 所有这些页面都以 admin 我需要将 Firebase 数据库和 Firebase 存储写入权限限制为这些用户的一小部分 并在未经身份验证 或未经管理员角色身份
  • 从.c调用MASM32过程

    我现在正在使用 Visual Studio 我需要构建一个 win32 应用程序并需要从 C 函数调用过程 但我总是收到构建错误 错误 3 错误 LNK1120 1 个未解析的外部 我已经通过一个过程将所有内容简化为一个简单的主函数和简单的
  • CodeIgniter - 删除文件,路径问题

    我的根目录中有 3 个文件夹 application system 和 uploads 在 application controllers mycontroller php 我有这行代码 delete files uploads file
  • 在 PowerShell 中显示 Unicode

    我想要实现的目标应该相当简单 尽管 PowerShell 试图让它变得困难 我想显示文件的完整路径 其中一些文件的名称中包含阿拉伯语 中文 日语和俄语字符 我总是得到一些无法解读的输出 如下所示 控制台中看到的输出正被另一个脚本使用 输出包
  • 如何在 Chrome DevTools 中查看元素上触发的事件?

    我在库的页面上有一个可自定义的表单元素 我想看看当我与它交互时会触发哪些 javascript 事件 因为我试图找出要使用的事件处理程序 如何使用 Chrome Web Developer 来做到这一点 您可以使用监控事件 http www
  • 如何告诉 JavaFX WebView 忽略“use strict”指令?

    我正在尝试使用以下代码将 mozilla 查看器集成到 JavaFx WebView 中 import javafx application Application import javafx scene Scene import java
  • 如何将这个数学方程写成c++

    我不知道如何编写C 中给出的公式 也不能使用捷径 我必须编写长版本的代码 这是我到目前为止所拥有的 4x 3 8x 2 9x 18 y 7 x 3 3x 2 18 表示绝对值 它需要采用这样的格式 这是我书中的一个示例 double y 4
  • Android的EditText在显示虚拟键盘并且涉及SurfaceView时隐藏

    我有一个简单的用户界面 EditText 应位于 SurfaceView 下方 我使用RelativeLayout 来排列这两个视图 现在 当我点击 EditText 打开虚拟键盘时 SurfaceView 会向上滑动 但 EditText
  • 同时维护多个emacs配置

    我想在同一台电脑上的同一用户帐户上同时维护多个 emacs 配置 例如 emacs prelude emacs starter kit 和我自己的自定义 emacs 配置 为此 我设置了 emacs1 d emacs2 d emacs3 d
  • Qt Signal/Slots 发送完整结构

    我正在尝试通过两个线程之间的信号 槽发送一个结构 我的信号 槽已正确连接 并且我已经能够发送包含部分数据的 QString 但现在我需要发送整个数据 而结构似乎是最明智的 但是 当我尝试时 信号未发送 接收 问题似乎仅与发送 接收结构 前后