我正在使用Code :: Blocks 8.02和mingw 5.1.6编译器.我在编译Qt项目时收到此错误:
C:\ Documents and Settings\Fuzz\Desktop\GUI\App_interface.cpp | 33 |未定义引用`vtable for AddressBook'
文件地址Book.h:
 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H
 #include <QWidget>
 class QLabel;
 class QLineEdit;
 class QTextEdit;
 class AddressBook : public QWidget
 {
     Q_OBJECT
 public:
     AddressBook(QWidget *parent = 0);
 private:
     QLineEdit *nameLine;
     QTextEdit *addressText;
 };
 #endif
文件AddressBook.cpp:
#include <QtGui>
#include "addressbook.h"
AddressBook::AddressBook(QWidget *parent)
     : QWidget(parent)
{
    QLabel *nameLabel = new QLabel(tr("Name:"));
    nameLine = new QLineEdit;
    QLabel *addressLabel = new QLabel(tr("Address:"));
    addressText = new QTextEdit;
    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(nameLabel, 0, 0);
    mainLayout->addWidget(nameLine, 0, 1);
    mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
    mainLayout->addWidget(addressText, 1, 1);
    setLayout(mainLayout);
    setWindowTitle(tr("Simple Address Book"));
}
小智 48
使用Qt Creator时:
blw*_*y10 44
警告:如果您已经有.pro文件,请不要这样做 - 您将丢失它!
为了自动确保生成所有moc cpp文件,您可以让qmake为您自动生成.pro文件,而不是自己编写.pro文件.
跑
qmake -project
在项目目录中,qmake将扫描您的目录中的所有C++标头和源文件,以生成moc cpp文件.
Cal*_*itt 16
几乎可以肯定的是,您没有在生成的moc_AddressBook.cpp文件中编译或不链接.(它应该是为您生成的 - 您moc在编译之前在代码上运行Qt ,对吧?)
为了更全面地回答,Q_OBJECT宏发出信号Qt的moc工具来创建一个额外的实现文件,其中包含支持QObject元信息系统所需的代码.如果您有任何信号或插槽,它也可以为这些做一些事情.
另一种解决方案可能是删除Q_OBJECT宏.您可能不希望这样做,但它可以帮助解决当前问题,并且对于您提供的代码并不是绝对必要的.
另外,我会注意到你的行:
#include "addressbook.h"
应该是:
#include "AddressBook.h"
根据您在问题中呈现文件名的方式.
假设您使用qmake生成Makefile,请确保在.pro文件的HEADERS变量中指定AddressBook.h,例如
HEADERS = AddressBook.h
对于 CMake 项目,将 CMAKE_AUTOMOC 设置为 ON,这解决了我的问题。
#Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)