我想使用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));
}
(其中paintable
的类型为Paintable*
)
但是Qt似乎无法在invokeMethod中使用uint16_t或char *,因为在运行时我得到以下消息:
QMetaMethod::invoke: Unable to handle unregistered datatype 'const char*'
和
QMetaMethod::invoke: Unable to handle unregistered datatype 'uint16_t'
分别
我能够使用color
成功注册我的自定义结构qRegisterMetaType()
,但由于uint16_t
和char*
不是结构或类,因此无效。
如果有人能告诉我如何做或者展示一个好的选择,我会很高兴。
答案 0 :(得分:8)
注册uint16_t的问题是:它是一个typedef,Qt已经注册了这个类型,但它的名称不同。由于QMetaType系统基于按名称确定类型,因此会导致问题。
你可以通过以下方式解决这个问题:
Q_DECLARE_METATYPE(uint16_t)
然后:
qRegisterMetaType<uint16_t>("uint16_t");
这会创建一个别名,以便可以使用该名称创建元类型。