views:

101

answers:

1

Using Qt Creator, I am creating a class with custom slots in Qt:


class CustomEdit : public QTextEdit
{
    Q_OBJECT

public:
    CustomEdit(QWidget* parent);

public slots:
    void onTextChanged ();
};

However, I'm getting thise linker error:

undefined reference to 'vtable for CustomEdit'

The documentation says:

if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber", you have probably forgotten to run the moc or to include the moc output in the link command.

... but it is not obvious what that means.

Is there something I need to add to my class, or to the .pro file?

EDIT -- Here is my .pro file:

QT += network \
    script \
    webkit \
    xml
TARGET = MyApp
TEMPLATE = app
SOURCES += main.cpp \
    MainWindow.cpp \
    CustomEdit.cpp 
HEADERS += MainWindow.h \
    CustomEdit.h
FORMS += mainwindow.ui

EDIT:

This question deals with the same problems, but the answers don't make it clear how I can fix this issue in Qt Creator. Do I need to explicitly add the moc-generated .cpp file to my list of files to be linked? That seems like a pain.

+1  A: 

Qt creator is an IDE which is used to create your Qt projects. That's all. But qmake allows you to buid the project. From qmake manual,

qmake automates the generation of Makefiles so that only a few lines of information are needed to create each Makefile. qmake generates a Makefile based on the information in a project file. qmake contains additional features to support development with Qt, automatically including build rules for moc and uic.

You don have to include your moc files separately, but you have to run qmake which contains all the information about the required moc files. Take a look at the generated Makefile.debug or Makefile.release after qmake and you can find all the moc files will be included for you.

Now to run qmake in Qt creator, just go to Build->RebuildAll which will run the qmake and all the (moc) files will be generated and linked (in Makefile.debug) as well.

Hopefully this will elimate your undefined reference.

liaK
It did, thanks. I also realized that when I create a new class in Qt Creator, I have to specify "Inherits QWidget" as the type information. It seems odd that I'd have to specify that explicitly, given that I've already told the IDE that my class derives from a Qt class, but that does the trick.
Jen