gpt4 book ai didi

c++ - 将 uint16_t 和 char* 与 QMetaObject::invokeMethod() 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:11 25 4
gpt4 key购买 nike

我想使用 QMetaObject::invokeMethod() 从不同线程异步调用槽

包含插槽的类声明为:

class Paintable : public QObject {
Q_OBJECT
[...]
public slots:
void drawString(uint16_t x, uint16_t y, uint16_t size, const char* str, color c);
}

调用invokeMethod的方法定义为:

void drawStringAsynchronously(uint16_t x, uint16_t y, uint16_t size, const char* str, color c) {
QMetaObject::invokeMethod(paintable,
"drawString",
Qt::QueuedConnection,
Q_ARG(uint16_t, x), Q_ARG(uint16_t, y), Q_ARG(uint16_t, size),
Q_ARG(const char*, str), Q_ARG(color, c));
}

(其中 paintablePaintable* 类型)

但 Qt 似乎无法在 invokeMethod 中使用 uint16_t 或 char*,因为在运行时我收到以下消息:

QMetaMethod::invoke:无法处理未注册的数据类型“const char*”

QMetaMethod::invoke:无法处理未注册的数据类型“uint16_t”

分别。

我能够使用 qRegisterMetaType() 成功注册我的自定义结构 color 但是因为 uint16_tchar* 没有这样不起作用的结构或类。

如果有人能告诉我如何做或展示一个好的替代方案,我将非常高兴。

最佳答案

注册 uint16_t 的问题是:它是一个 typedef,Qt 已经注册了这个类型,但是它的名称不同。由于 QMetaType 系统基于根据名称确定类型,这会导致问题。

您可以通过以下方式解决此问题:

Q_DECLARE_METATYPE(uint16_t)

然后:

qRegisterMetaType<uint16_t>("uint16_t");

这会创建一个别名,以便可以使用该名称创建元类型。

关于c++ - 将 uint16_t 和 char* 与 QMetaObject::invokeMethod() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com