Qt c++ 类 + 子类使用 Q_OBJECT 不起作用
Qt c++ class+subclass using Q_OBJECT doesn´t work
我在使用Q_OBJECT:创建类+子类时遇到了最困难的时候
我有一个类几何和一些类Geo_1PF,Geo_2,。。继承自几何体的。我创建了这些类,一切都很好。现在我想使用QMetaType,为此我需要声明Q_Object。一旦我使用了Q_OBJECT/Q_DECLARE_METATYPE,我的问题就开始了。
我得到错误"对vtable的未定义引用…">在再次编译之前,我尝试删除所有.o和所有moc_.cpp。我在*.pro文件中添加了QT+=core,但没有成功。
- 是否必须将Q_OBJECT/Q_DECLARE_METATYPE放在父类和cild类中
- 为什么会出现此错误
有人能帮我吗?
这是我的代码:
geometry.h:
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QMetaType>
#include <QWidget>
#include <QObject>
#include <QDebug>
class Geometry
{
// Q_OBJECT
protected:
public:
Geometry();
virtual ~Geometry(void) {}
virtual void write_LNE();
//Q_DECLARE_METATYPE(Geometry);
#endif // GEOMETRY_H
-
geometry.cpp:
#include "geometry.h"
Geometry::Geometry()
{ qDebug() << "Constructor: hier ist Geometry"; }
void Geometry::Haupt()
{ qDebug() << " Das hier ist die Haupt von Geometry ....." ; }
void Geometry::write_LNE(){}
-
Geo_1PF.h:
#ifndef GEO_1PF_H
#define GEO_1PF_H
#include "geometry.h"
class Geo_1PF : public Geometry
{
// Q_OBJECT
public:
Geo_1PF();
~Geo_1PF() {}
virtual void write_LNE();
};
//Q_DECLARE_METATYPE(Geo_1PF);
#endif // GEO_1PF_H
Geo_1PF.cpp:#包括"Geo_1PF.h">
Geo_1PF::Geo_1PF() { }
如果您想使用Q_OBJECT
,您的类应该继承自QObject
或其子类
class Geometry : public QObject
{
Q_OBJECT
//...
请参阅使用元对象编译器(moc)
首先,Q_OBJECT
宏是不可继承的。它必须包含在每个直接或间接继承QObject
的对象中。如果基类是QObject
派生的,那么派生类也是QObject
派生的,因此必须包含宏。
来自文件:
Q_OBJECT宏必须出现在类的私有部分中声明自己的信号和插槽或使用其他Qt的元对象系统提供的服务。
其次,Q_DECLARE_METATYPE()
要求对象具有复制构造函数,而QObject
在设计上不支持复制构造函数,因此不可能将Q_DECLARE_METATYPE()
与QObject
派生类一起使用。这也没有意义,因为每个QObject
都是自动的元类型,因为它是由元对象编译器处理的。如果您声明一个指向类型Q_DECLARE_METATYPE(Geometry*)
的指针,它就会起作用。将类型注册为元类型需要该类型具有复制构造函数,如果没有,则会出现错误。
从类的外观来看,它们不需要从QObject
派生,所以不应该这样做,应该删除宏(如果不是继承QObject
或派生),然后Q_DECLARE_METATYPE(Geometry)
应该可以工作。看起来你觉得你需要Q_OBJECT
到Q_DECLARE_METATYPE()
,但事实恰恰相反——两者不兼容——后者必须有,前者不能有复制构造函数。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- C++赋值 boost::p ython::object 不起作用。为什么?