我可以继承 QEvent 吗?

Posted

技术标签:

【中文标题】我可以继承 QEvent 吗?【英文标题】:Can I subclass QEvent? 【发布时间】:2013-08-14 09:03:37 【问题描述】:

我尝试创建一个作为QEvent 子类的类,但构建后出现错误。

我的步骤, 1.使用Qt控制台模板创建项目 2. 创建如下代码

#ifndef MYEVENT_H
#define MYEVENT_H

#include <QEvent>
#include <QObject>

class MyEvent : public QEvent

    Q_OBJECT
public:
    explicit MyEvent();

signals:

public slots:
;

#endif

//CPP File
MyEvent::MyEvent() :
    QEvent(QEvent::User)



moc_MyEvent.cpp:70:21: error: invalid use of non-static data member 'd_ptr'
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
           ~~~~~~~~~^~~~~
moc_MyEvent.cpp:70:21: error: 'd_ptr' is a protected member of 'QObject'
../../../../../../Qt5.1.0/5.1.0/clang_64/include/QtCore/qobject.h:411:33: note: declared protected here
    QScopedPointer<QObjectData> d_ptr;
                            ^

Qt5 Mac OSX 10.8.4


我该如何解决?为什么?谢谢。

【问题讨论】:

【参考方案1】:

Dcow 给出了正确的答案。

您的错误是QEvent 没有从QObject 继承,而您尝试这样做。你不应该使用Q_OBJECT 宏,或者你也应该从QObject 插入你的类。但这是黑暗的一面。

【讨论】:

我快了 14 秒 :) 是的:)。白俄罗斯的网速太慢了。 好的,我明白了。我以为 Qt 的所有类都来自 QObject,所以它成为了习惯。 @iAsk 不是全部!有很多类没有!查看容器、字符串、QModelIndex 和许多其他内容。【参考方案2】:

首先为什么?你应该写下你为什么需要这个,我确信你试图解决的问题解决方案是错误的!

第二个问题是Q_OBJECT 宏。 QEvent 不是 QObject 所以这个宏不适用,这就是你有这个错误的原因。

【讨论】:

【参考方案3】:

正如已经指出的那样:没有Q_OBJECT。但是让我添加一些内容,并将您的注意力指向一个很少使用且广为人知的宏:Q_GADGET

几乎Q_OBJECT 用于非QObjects

来自 Qt 文档:

使用 Q_GADGET 而不是 Q_OBJECT 来启用元对象系统的 支持不是 QObject 子类的类中的枚举。 Q_GADGET 使类成员 staticMetaObject 可用。静态元对象是 类型为 QMetaObject 并提供对使用声明的枚举的访问 Q_ENUMS。 Q_GADGET 仅适用于 C++。

不时派上用场。

【讨论】:

以上是关于我可以继承 QEvent 吗?的主要内容,如果未能解决你的问题,请参考以下文章

事件(QEvent*)与 mousePressEvent(QMouseEvent *)冲突?

第四十四课发送自定义事件(下)

Qt:定义自定义事件类型

如何在 QEvent 中捕获 NonClientAreaMouseMove 事件

将自定义 QEvent 传播到 Qt/PyQt 中的父小部件

QEvent postEvent/sendEvent