6

我想使用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_tchar*

如果有人能告诉我如何做或展示一个好的选择,我会很高兴。

4

1 回答 1

10

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

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

Q_DECLARE_METATYPE(uint16_t)

然后:

qRegisterMetaType<uint16_t>("uint16_t");

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

于 2013-02-05T18:01:36.130 回答