将uint16_t和char*与QMetaObject::invokeMethod()一起使用
Using uint16_t and char* with QMetaObject::invokeMethod()
我想使用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'
分别。
我能够使用qRegisterMetaType()
成功注册我的自定义结构体color
,但由于uint16_t
和char*
不是结构体或类,这将不起作用。
如果有人能教我怎么做,或者展示一个好的替代方案,我会很高兴。
注册uint16_t的问题是:它是一个typedef,Qt已经注册了这个类型,但它的名称不同。由于QMetaType系统是基于根据类型的名称来确定类型的,这会导致问题。
你可以用来解决这个问题
Q_DECLARE_METATYPE(uint16_t)
然后:
qRegisterMetaType<uint16_t>("uint16_t");
这将创建一个别名,以便可以使用该名称创建元类型。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 将uint16_t和char*与QMetaObject::invokeMethod()一起使用