2014-09-29 5 views
0

C++에 GUI를 만들었습니다. 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_ */ 

다음과 같이 생성자와 소멸자는 다음과 같습니다 : 다음과 같이

헤더 파일은

내 헤더 파일의 모든 내 .PRO 파일의 HEADERS 목록에 나열됩니다
MediaPlayerWizard::MediaPlayerWizard(QWidget *parent):QWidget(parent) 
{ 
    Initialize(); //Instantiates the buttons and labels etc.. 
} 

MediaPlayerWizard::~MediaPlayerWizard(){ 

} 

, 그리고 Q_OBJECT 매크로를 헤더 파일에 추가 한 후 QMake을 실행했습니다.

초기화 코드 :

당신은 mediaplayerwizard.h에서 //Q_OBJECT 주석을 제거 할 필요가
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

와 선언을

void btnActivateClicked();

을 변경하려고합니다. 실행시 또는 컴파일시 – vahancho

+0

? 어쨌든 빌드 디렉토리를 정리하고, 매크로를 추가하고 다시 빌드하십시오. – UmNyobe

+0

MediaPlayerWizard.cpp를 빌드 할 때 – GenericMadman

답변

0

이 라인은 Q_OBJECT

를 포함 그리고 정의해야합니다 : 여기

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(); 
} 

가 표시되는 오류 메시지입니다 슬롯으로 무효 btnActivateClicked();.

+0

나는이 질문을 다시 읽어야한다고 생각한다. 그리고 다시 한 번. – UmNyobe

+0

그의 게시 된 코드에 주석 행이 포함되어있어 Q_OBJECT 매크로를 추가해야한다는 오류가 발생합니다. 사실, 신호 및 슬롯의 사용은 어떤 경우에도 Q_OBJECT의 정의를 필요로합니다. –

+0

그가 편집 한 게시물 일 수도 있습니다. 이제 그의 'Q_OBJECT'는 주석이 풀 렸습니다. –

0

빌드 디렉토리를 제거하고 솔루션을 다시 빌드해야합니다. 다시 빌드가 작동하지 않을 수 있으므로 빌드 디렉토리를 제거하십시오. 이것은 an old Qt issue입니다.

+0

나는 이렇게 행운이 없다. – GenericMadman

+0

@GenericMadman *** 정확한 오류 메시지 ***을 자르고 여기에 붙여 넣을 수 있습니까? 그리고 위의 코드가 컴파일중인 코드인지 확인하십시오. – UmNyobe

+0

메인 포스트 하단에 추가했습니다. – GenericMadman

2

회원 기능을 슬롯으로 사용하려면 슬롯으로 표시해야합니다. 그래서 너무`초기화() '함수에 대한 코드를 보여주십시오

private slots: void btnActivateClicked();

또는

Q_SLOT void btnActivateClicked();

+0

+1 그가 Q_OBJECT를 주석으로 처리 한 후에도 이것을 발견했습니다. :) –