2016-02-13 90 views
1

我已經Ubuntu 14.04C++QT, 我會extendQPushbutton,我會作出新的Slot 我做的:如何解決未定義的引用在C++中的vtable上QT

#include<QApplication> 
#include<QDialog> 
#include<QLabel> 
#include <X11/Xlib.h> 
#include<QVBoxLayout> 
#include<iostream> 
#include<QWidget> 
#include<QPushButton> 
#include <QThread> 
#include <QGridLayout> 
#include <QSplitter> 
#include<QAbstractButton> 
using namespace std; 




class bot : public QPushButton { 
    Q_OBJECT; 

public slots: 
    void txt() { 
     setText("hi"); 
     } 


}; 


int main(int a , char * b[]) 
{ 
    QApplication application(a,b); 
    QPushButton *button = new QPushButton(); 
    bot *l = new bot(); 
    button->setFixedSize(100,100); 
    l->setText("sssssssssssssss"); 

    QVBoxLayout *ll = new QVBoxLayout; 
    ll->addWidget(l); 
    ll->addWidget(button); 
    QWidget x ; 
    x.setLayout(ll); 
    x.show(); 
    QObject::connect(button, SIGNAL(clicked()), l , SLOT(txt())); 

    return application.exec(); 


} 

的問題是:

/home/user/untitled6/sd.cpp:18: error: undefined reference to `vtable for bot'

如何解決問題???

我file.pro是:

SOURCES += \ 
    sd.cpp 
QT += widgets 

FORMS += \ 
    form.ui 

回答

1

通常情況下,這樣的錯誤,可以通過運行QMAKE解決。任何時候當你創建一個派生自QObject的新類時,Qt的模型元對象編譯器(MOC)需要爲新類的元類自動生成代碼 - QMake確保這種情況發生。

如果您使用的是Qt Creator,只需從Build菜單中選擇Run qmake即可。

您可能還需要運行Clean project XClean all,也可在Build菜單中找到。

的MOC可以喜怒無常,所以你需要做到以下幾點:

  • 將您QObject派生類到一個單獨的源文件和頭文件(在你的情況,創建bot.hbot.cpp,並移動有類代碼)
  • 單獨的聲明和您的時隙的代碼定義(在bot.cpp限定txt作爲bot::txt

MOC生成一個相應的元類文件(在你的情況下爲moc_bot.cpp),並且當一個文件中有多個QObject衍生類時,有時會產生困惑。最佳做法是對每個QObject衍生類使用一個頭文件和一個源文件。

如果一切都失敗了,您可能需要刪除項目的.pro.user文件,然後退出並重新啓動Qt Creator。然後從Build菜單中選擇Clean all,Run qmake,Rebuild All

+0

它仍然是同樣的問題! – SalamBoy

+0

@SalamBoy嘗試清潔項目,請參閱編輯 –

+0

我會的,\t \t 它保持了同樣的問題 – SalamBoy

相關問題