继承QTreeWidgetItem发生error: 'staticMetaObject' is not a member of 'QTreeWidgetItem' 错误

点击打开链接

#ifndef QQUSERITEM_H就发生下列错误

#define QQUSERITEM_H
#include <QTreeWidgetItem>
class QQUserItem :public QTreeWidgetItem
{
Q_OBJECT
public:
explicit QQUserItem(QQUserItem *parent = 0);
signals:
public slots:
};
#endif // QQUSERITEM_H

debug\moc_QQUserItem.cpp:41:8: error: 'staticMetaObject' is not a member of 'QTreeWidgetItem'

 

..\..\Qt\4.6.3\include/QtCore/../../src/corelib/kernel/qobject.h: In member function 'virtual const QMetaObject* QQUserItem::metaObject() const':

 

..\..\Qt\4.6.3\include/QtCore/../../src/corelib/kernel/qobject.h:296:33: error: 'QScopedPointer<QObjectData> QObject::d_ptr' is protected

 

debug\moc_QQUserItem.cpp:51:21: error: within this context

 

..\..\Qt\4.6.3\include/QtCore/../../src/corelib/kernel/qobject.h:296:33: error: object missing in reference to 'QObject::d_ptr'

 

debug\moc_QQUserItem.cpp:51:21: error: from this location

 

..\..\Qt\4.6.3\include/QtCore/../../src/corelib/kernel/qobject.h:296:33: error: 'QScopedPointer<QObjectData> QObject::d_ptr' is protected

 

debug\moc_QQUserItem.cpp:51:50: error: within this context

 

..\..\Qt\4.6.3\include/QtCore/../../src/corelib/kernel/qobject.h:296:33: error: object missing in reference to 'QObject::d_ptr'

 

debug\moc_QQUserItem.cpp:51:50: error: from this location

 

debug\moc_QQUserItem.cpp: In member function 'virtual void* QQUserItem::qt_metacast(const char*)':

 

debug\moc_QQUserItem.cpp:59:12: error: 'qt_metacast' is not a member of 'QTreeWidgetItem'

 

debug\moc_QQUserItem.cpp: In member function 'virtual int QQUserItem::qt_metacall(QMetaObject::Call, int, void**)':

 

debug\moc_QQUserItem.cpp:64:11: error: 'qt_metacall' is not a member of 'QTreeWidgetItem'

 

debug\moc_QQUserItem.cpp: In member function 'virtual void* QQUserItem::qt_metacast(const char*)':

 

debug\moc_QQUserItem.cpp:60:1: warning: control reaches end of non-void function

 

debug\moc_QQUserItem.cpp: In member function 'virtual const QMetaObject* QQUserItem::metaObject() const':

 

debug\moc_QQUserItem.cpp:52:1: warning: control reaches end of non-void function

 

mingw32-make[1]: *** [debug/moc_QQUserItem.o] Error 1

 

mingw32-make: *** [debug] Error 2

 

The process "D:/MinGW/bin/mingw32-make.exe" exited with code %2.

Error while building project MyQQ (target: Desktop)

When executing build step 'Make'

修改成这样 class QQUserItem :public QObject,public QTreeWidgetItem就没错误了,搜到了如下资料:

居然有这样的错误:'staticMetaObject' is not a member of 'Ui::MainWindow'

 

最早接触到这类设计其实是从Borland C++ Builder 开始的,作为一个所谓的快速开发工具,其实我对其实现界面设计那块到现在都没有清晰的理解。后来接触了Java 一段时间,那时候只懂得自己设计界面就是继承一个类,如主窗口或者 applet,然后在该类中添加很多其他的 component 作为其 protected 成员。可是很少考虑到怎么更方便的设计。因此,可以说接触到第一个这种设计思想的GUI 库就是在 Qt 了。 不得不说 Qt 其实和 Java 很像,虽然说 Qt 是 C++ 写成,但是注意到它其实是单一祖先 QObject 一脉相承,通过 QMetaObject 实现的RTTI,这多多少少和Java单一祖先一致,但是 Qt 不排斥使用其他的 C++ class,只是失去了 signal/slot 机制。在 moc 的 man page 里面,其实介绍了 Qt 实现的种种局限性:

我们无法使用 template 继承 QObject,换言之,下面代码无法被 moc 转换成为有效的 C++ compiler 可编译代码:
     template<class>  

     class TemplateClass : public QObject {  
           Q_OBJECT  
           // ...
     public slots:  
          // ...
     } ;class>
使用 multiple inheritance 必须把 QObject 或者其子类放在第一个父类的位置(因为使用 Q_OBJECT 需要覆盖),然后继承别的类。颠倒后,如 g++ 会抱错,如
     multiclass.hpp:17: Warning: Class MultiClass inherits from two QObject subclasses NoneQtClass and QObject. This is not supported!
     moc_multiclass.cpp:39: error: ‘staticMetaObject’ is not a member of ‘NoneQtClass’
     moc_multiclass.cpp: In member function ‘virtual void* MultiClass::qt_metacast(const char*)’:
     moc_multiclass.cpp:55: error: ‘qt_metacast’ is not a member of ‘NoneQtClass’
     moc_multiclass.cpp: In member function ‘virtual int MultiClass::qt_metacall(QMetaObject::Call, int, void**)’:
     moc_multiclass.cpp:60: error: ‘qt_metacall’ is not a member of ‘NoneQtClass’
     make: *** [moc_multiclass.o] Error 1         MultiClass 继承 QObject 和 NoneQtClass,插入的 Q_OBJECT 展开后,因为将 NoneQtClass 放在第一位后 MultiClass 的结构已经不是 QObject 在前面所以创建staticMetaObject 出错,后面虚函数表也因为在后面所以导致使用的其实是前面那个 class 的 vtable。

函数指针不能作为 signal/slot 的参数,这个可以用 typedef 克服,如
class SomeClass : public QObject
{  
         Q_OBJECT  
          //...
public slots:  
        // illegal
         void apply( void (*apply)(List *, void *), void * );  
}; 将被认为非法(主要是判断参数类型时会失败,记得 QMetaObject 存下来的是什么信息么?),但是

typedef void (*ApplyFunctionType)( List *, void * );  

class SomeClass : public QObject
{  
         Q_OBJECT  
         //...
public slots:  
         void apply( ApplyFunctionType, char * );  
}; 是可行的。

友 元声明最好不要放在 signal 和 slot 声明中,这很明显,因为多数情况下虽然根据宏替换, signals: 被替换为 protected:,slots 被替换为空,但是编译器处理 friend 可能并不完全这样无关的处理,理论上说标准的编译器应该能 work,如 g++ 4.3.3.
signal 和 slot 不能被 upgrade,这是因为 moc 需要一个完整的函数声明,而提升的时候声明是不完整的,如
class SlotClass : public QObject
{  
         Q_OBJECT  
protected slots:  
         int getValue() ;  
} ;  

class UpgradeSlotClass : public SlotClass
{  
         Q_OBJECT  
public slots:  
         Slot::getValue ;  
} ;  其中的 Slot::getValue 的提升在正常的情况是被允许的,可见报错的是 moc,

/usr/bin/moc-qt4 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. upgradeslotclass.hpp -o moc_upgradeslotclass.cpp
upgradeslotclass.hpp:15: Error: Not a signal or slot declarationsignal 和 slot 的参数不能使用宏,这是因为 moc 不展开宏。
嵌套类声明不应该出现在 signal 或者 slot 里面,也是因为 moc 不能处理的原因。
构造函数不应出现在 signal 和 slot 里面,虽然是函数,但是没有必要。
Q_PROPERTY 宏声明属性时应在包含其读写函数的 public 节之前,写在同一个 public 里面不允许,注意
#define Q_PROPERTY(text)其实在类声明时这句话没有任何作用,只是 moc 编译会产生对应的代码,而 moc 要求这部分必须以类似下面的方式书写

class PropertyClass : public QObject
{  
         Q_OBJECT  
         Q_PROPERTY( int value READ getValue WRITE setValue )  
     

转载于:https://www.cnblogs.com/Podevor/archive/2011/10/11/2788017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值