2014-09-29 7 views
0

Я успешно создал GUI в C++ с помощью Qt в Eclipse, но потом, когда он пришел к присвоению собственного события нажатия кнопки, мне сказало, что макрос Q_OBJECT нужно будет включить в заголовочном файле моего класса QWidget.Q_OBJECT вызывая «неопределенную ссылку на v_table» Выпуск

После запуска окно больше не отображается, и я встречаюсь с ошибкой как для конструктора, так и для деструктора моего класса QWidget.

Заголовочный файл выглядит следующим образом:

#ifndef MEDIAPLAYERWIZARD_H_ 
#define MEDIAPLAYERWIZARD_H_ 

#include "../MediaPlayer.Helpers/SystemConfiguration.h" 
#include "../MediaPlayer.Helpers/StringHelpers.h" 
#include "../MediaPlayer.DataAccess/DataRepository.h" 
#include "../MediaPlayer.Helpers/Globals.h" 
#include <QtGui/QApplication> 
#include <QtGui/QLabel> 
#include <QtGui> 
#include <QtCore> 
#include <sstream> 
#include <iostream> 

class MediaPlayerWizard: public QWidget { 
    Q_OBJECT 

public: 
    MediaPlayerWizard(QWidget *parent = 0); 
    void Initialize(); 
    virtual ~MediaPlayerWizard(); 

private: 
    QLabel *lblWelcomeMessage; 

    //Input 
    QLineEdit *txtName; 
    QLabel *lblName; 

    QLineEdit *txtActivationCode; 
    QLabel *lblActivationCode; 

    //Buttons 
    QPushButton *btnActivate; 
    QPushButton *btnCancel; 

    //Layouts 
    QVBoxLayout *fldWizardLayout; 

    QHBoxLayout *fldWelcomeMessage; 
    QHBoxLayout *fldName; 
    QHBoxLayout *fldActivationCode; 
    QHBoxLayout *fldButtons; 

private slots: 
    void btnActivateClicked(); 
}; 

#endif /* MEDIAPLAYERWIZARD_H_ */ 

И конструктор и деструктор являются следующие:

MediaPlayerWizard::MediaPlayerWizard(QWidget *parent):QWidget(parent) 
{ 
    Initialize(); //Instantiates the buttons and labels etc.. 
} 

MediaPlayerWizard::~MediaPlayerWizard(){ 

} 

Все мои файлы заголовков перечислены в списке HEADERS моего .pro файла , и я запустил QMake после добавления макроса Q_OBJECT в мой заголовочный файл.

Initialize код:

void MediaPlayerWizard::Initialize() 
{ 
    //Widget Configuration 

    this->setWindowTitle("Media Player: First Run Wizard"); 

    int labelWidth = 150; 

    //Welcome Message 
    lblWelcomeMessage = new QLabel; 
    lblWelcomeMessage->setText("Welcome to the first run wizard that will assist you in\n connecting and registering this advertising player to your account."); 
    lblWelcomeMessage->setAlignment(Qt::AlignCenter); 

    //Input Labels 
    lblName = new QLabel; 
    lblName->setText("Name: "); 
    lblName->setFixedWidth(labelWidth); 

    lblActivationCode = new QLabel; 
    lblActivationCode->setText("Application Code: "); 
    lblActivationCode->setFixedWidth(labelWidth); 

    //Input Fields 
    txtName = new QLineEdit(); 
    txtActivationCode = new QLineEdit(); 

    //Buttons 
    btnActivate = new QPushButton; 
    btnActivate->setText("Activate"); 
    btnCancel = new QPushButton; 
    btnCancel->setText("Cancel"); 

    //Button Events 
    QObject::connect(btnActivate, SIGNAL(clicked()), this, SLOT(btnActivateClicked())); 
    QObject::connect(btnCancel, SIGNAL(clicked()), qApp, SLOT(quit())); 

    //Layouts 
    fldWelcomeMessage = new QHBoxLayout; 
    fldWelcomeMessage->addWidget(lblWelcomeMessage); 

    fldName = new QHBoxLayout; 
    fldName->addWidget(lblName); 
    fldName->addWidget(txtName); 

    fldActivationCode = new QHBoxLayout; 
    fldActivationCode->addWidget(lblActivationCode); 
    fldActivationCode->addWidget(txtActivationCode); 

    fldButtons = new QHBoxLayout; 
    fldButtons->addWidget(btnActivate); 
    fldButtons->addWidget(btnCancel); 

    fldWizardLayout = new QVBoxLayout; 
    fldWizardLayout->addLayout(fldWelcomeMessage); 
    fldWizardLayout->addLayout(fldName); 
    fldWizardLayout->addLayout(fldActivationCode); 
    fldWizardLayout->addLayout(fldButtons); 

    setLayout(fldWizardLayout); 
    show(); 
} 

Вот сообщение об ошибке отображается:

Building target: MediaPlayerCPP 
Invoking: Cross G++ Linker 
g++ -L/usr/lib -o "MediaPlayerCPP" ./src/MediaPlayer.o ./src/MediaPlayerWizard.o ./src/mysqlapidemo.o ./MediaPlayer.Services/MediaPlayerClient.o ./MediaPlayer.Helpers/DeviceManagement.o ./MediaPlayer.Helpers/Globals.o ./MediaPlayer.Helpers/MD5.o ./MediaPlayer.Helpers/StringHelpers.o ./MediaPlayer.Helpers/SystemConfiguration.o ./MediaPlayer.DataAccess/DataObject.o ./MediaPlayer.DataAccess/Database.o ./MediaPlayer.DataAccess/Media.o ./MediaPlayer.DataAccess/MediaLog.o ./MediaPlayer.DataAccess/MediaLogProvider.o ./MediaPlayer.DataAccess/MediaProvider.o ./MediaPlayer.DataAccess/MediaSchedule.o ./MediaPlayer.DataAccess/MediaScheduleProvider.o ./MediaPlayer.DataAccess/SystemConfig.o ./MediaPlayer.DataAccess/SystemConfigProvider.o -lQtCore -lmysqlclient -lz -lQtGui 
./src/MediaPlayerWizard.o: In function `MediaPlayerWizard::MediaPlayerWizard(QWidget*)': 
/home/gtteam/Projects/MediaPlayerCPP/Debug/../src/MediaPlayerWizard.cpp:10: undefined reference to `vtable for MediaPlayerWizard' 
/home/gtteam/Projects/MediaPlayerCPP/Debug/../src/MediaPlayerWizard.cpp:10: undefined reference to `vtable for MediaPlayerWizard' 
./src/MediaPlayerWizard.o: In function `MediaPlayerWizard::~MediaPlayerWizard()': 
/home/gtteam/Projects/MediaPlayerCPP/Debug/../src/MediaPlayerWizard.cpp:77: undefined reference to `vtable for MediaPlayerWizard' 
/home/gtteam/Projects/MediaPlayerCPP/Debug/../src/MediaPlayerWizard.cpp:77: undefined reference to `vtable for MediaPlayerWizard' 
collect2: error: ld returned 1 exit status 
make: *** [MediaPlayerCPP] Error 1 
+0

Пожалуйста, покажите код для '' функции Initialize() тоже. – vahancho

+0

при запуске или при компиляции? В любом случае очистите свой каталог сборки, добавьте макрос и создайте снова. – UmNyobe

+0

При создании MediaPlayerWizard.cpp – GenericMadman

ответ

0

Раскомментируйте //Q_OBJECT в mediaplayerwizard.h, линия должна содержать только Q_OBJECT

и определить void btnActivateClicked(); как слот.

+0

Думаю, вам нужно снова прочитать вопрос. И еще раз. – UmNyobe

+0

его опубликованный код содержит эту строку, и он получает ошибку, которую должен добавить макрос Q_OBJECT. Фактически, использование сигналов и слотов требует определения Q_OBJECT в любом случае. –

+0

Возможно, он отредактировал сообщение, теперь его 'Q_OBJECT' раскоментирован. –

0

Вам нужно удалить каталог сборки и снова создать решение. Rebuild не может работать, поэтому удалите каталог сборки. Это an old Qt issue.

+0

Я сделал это, без такой удачи. – GenericMadman

+0

@GenericMadman вы можете вырезать точное сообщение об ошибке *** и вставить здесь? И вы уверены, что код, показанный выше, является тем, что вы компилируете? – UmNyobe

+0

Я добавил его к нижней части главного сообщения. – GenericMadman

2

Вам необходимо отметить функцию-член как слот, чтобы использовать его в качестве слота. Итак, попробуйте изменить декларации

void btnActivateClicked();

с

private slots: void btnActivateClicked();

или

Q_SLOT void btnActivateClicked();

+0

+1 нашел это тоже после того, как он исправил комментарий Q_OBJECT :) –