我正在使用Qt创建一个GUI应用程序;我尝试使用Qt hello world
并且它完美地工作,但是当我创建自定义列表小部件时,我在编译时遇到undefined reference to vtable
错误:
我正在使用eclipse和c ++
#ifndef QMENUFILTER_H_
#define QMENUFILTER_H_
#include <qmenu.h>
class CustomMenuFilter : QMenu
{
Q_OBJECT
public:
CustomMenuFilter () ;
~CustomMenuFilter() ;
private:
QMenu FilterMenu;
QAction *AddFilterAct ;
QAction *DeleteFilterAct ;
Q_SLOT
void contextMenuEvent(QContextMenuEvent *event);
};
#endif /* QMENUFILTER_H_ */
#include "QMenuFilter.h"
CustomMenuFilter::CustomMenuFilter():QMenu()
{
DeleteFilterAct = new QAction("DeleteFilter" , this);
AddFilterAct = new QAction("AddFilter" , this);
AddFilterAct->setText("AddFilter");
DeleteFilterAct->setText("DeleteFilter");
}
答案 0 :(得分:5)
您还需要定义dtor,这将创建vtable
CustomMenuFilter::~CustomMenuFilter() { ... }
虽然有一些(依赖于编译器的)规则描述了编译器何时发出vtable,但通常并不重要。重要的是,您需要定义dtor,然后编译器将处理vtable,因此如果您看到错误“未定义的vtable引用”,请始终检查dtor。
答案 1 :(得分:2)
多个编译器在TU中发出vtable,它定义了虚拟的第一个行外定义 - 隐式地,在这种情况下是你的析构函数(因为QMenu的析构函数可能是虚拟的)。
所以添加析构函数的定义应该修复它。
// CustomMenuFilter.cpp
CustomMenuFilter::~CustomMenuFilter() {}
答案 2 :(得分:1)
从#qt factoids中获取vtable错误到QObject派生类:
Q_OBJECT
宏。 HEADERS
列表的.pro文件中。Q_OBJECT
添加到其中一个类或修改.pro文件时运行qmake。我没有在构建日志的最终可执行文件中看到moc的输出链接:
g ++ -L / usr / local / lib / -lQtGui -lQtCore -o“CameraManagerAfterBeta”./ turunk / Source / Camera.o ./trunk/Source/Interface.o ./trunk/Source/Manager.o。 /trunk/Source/QMenuFilter.o ./trunk/Source/main.o -lopencv_core -lopencv_objdetect -lopencv_video -lopencv_highgui -lopencv_imgproc
没有链接moc_QMenuFilter.o。这是错误。您可能添加了Q_OBJECT
宏并忘记重新运行qmake(或者甚至没有在.pro文件的HEADERS
列表中添加标题)。
答案 3 :(得分:0)
将CMAKE_AUTOMOC设置为ON,这解决了我的问题。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5</version>
<configuration>
<mojoDependencies>com.company:something</mojoDependencies>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<executions>
<execution>
<id>default-descriptor</id>
<goals>
<goal>descriptor</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
</plugin>