有没有一种更干净的方式来注册Qt自定义事件
Is there a cleaner way to register Qt custom events?
我需要为Qt应用程序创建几个自定义事件类。
现在,我似乎需要为每个事件类实现以下事件类型注册代码:
class MyEvent : public QEvent
{
public:
MyEvent() : QEvent(registeredType())
{
}
static QEvent::Type eventType;
private:
static QEvent::Type registeredType();
}
QEvent::Type MyEvent::eventType = QEvent::None;
QEvent::Type MyEvent::registeredType()
{
if (eventType == QEvent::None)
{
int generatedType = QEvent::registerEventType();
eventType = static_cast<QEvent::Type>(generatedType);
}
return eventType;
}
关于如何简化它,或者至少用宏隐藏它,有什么建议吗?
这就是模板的作用。它们可以与常数积分参数一起使用,这些参数也需要在编译时知道:
enum EventNames { UpdateEvent,... }
template<EventNames E>
class MyEvent : public QEvent
{
public:
MyEvent() : QEvent(registeredType())
{
}
static QEvent::Type eventType;
private:
static QEvent::Type registeredType();
}
常见的代码是这样的:
template<EventNames E>
QEvent::Type MyEvent<E>::registeredType()
{
if (eventType == QEvent::None)
{
int generatedType = QEvent::registerEventType();
eventType = static_cast<QEvent::Type>(generatedType);
}
return eventType;
}
静态初始化(小心!)看起来像这样:
QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;
每个事件类型的特定代码可以实现为模板专用化。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 无法将结构注册为增强几何体3D点
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 如何使用AngelScript注册SFML Vector2运算符
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 在遍历处理程序的向量时注册和注销处理程序
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 有没有任务栏API可以立即应用注册表更改
- 以编程方式锁定注册表项以避免并发问题
- 从C++注册预关闭通知的正确方式
- 如何在不同的目标平台上以编程方式智能注册 32 位 COM/DLL 组件
- 以编程方式为所有用户设置注册表软件策略键
- 通过元编程或其他方式自动注册dll模块中的静态对象工厂
- 有没有一种更干净的方式来注册Qt自定义事件
- 在构建机器上注册.tlb的首选方式是什么
- 最准确和正确的方式来比较两个大的windows 8.1注册表文件(c++ / c#或任何其他)