2017-08-03 73 views
0

我做了從QLabel繼承的類。這個班也有公共插槽,應該改變標籤標題。我「呼叫」這個SLOTclicked()信號的按鈕。 當我按下按鈕時沒有發生任何事情。繼承自QLabel的類,爲什麼不調用自定義槽?

#include <QApplication> 
#include <QLabel> 
#include <QPushButton> 

class Label : public QLabel 
{ 
public: 
    Label(QString a) : QLabel(a){} 

public slots: 
    void change() 
    { 
     this->setNum(2); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QPushButton* button = new QPushButton("Button"); 
    Label* lbl = new Label("Label"); 

    button->show(); 
    lbl->show(); 

    QObject::connect(button, SIGNAL(clicked(bool)), lbl, SLOT(change())); 

    return a.exec(); 
} 

我應該怎麼做來改變插槽的標題?

+0

作爲一般規則,不要在main.cpp中聲明'QObject'派生類,或者如果可能的話在任何cpp中聲明,這樣你就必須手動包含moc文件。 – dtech

回答

2

爲了使信號和槽被識別,這些類必須使用Q_OBJECT宏私處。

要做的另一件事是包括"main.moc",欲瞭解更多信息,請閱讀this

#include <QApplication> 
#include <QLabel> 
#include <QPushButton> 

class Label : public QLabel 
{ 
    Q_OBJECT 
public: 
    Label(const QString &text, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()) : 
    QLabel(text, parent, f){} 

public slots: 
    void change() 
    { 
     setNum(2); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QPushButton* button = new QPushButton("Button"); 
    Label* lbl = new Label("Label"); 

    button->show(); 
    lbl->show(); 

    QObject::connect(button, SIGNAL(clicked()), lbl, SLOT(change())); 

    return a.exec(); 
} 

#include "main.moc" 

在作出這些改變必須執行以下的結尾:

  1. 按清理所有在Build菜單。
  2. 然後在相同的菜單中運行qmake。
  3. 而你只是撰寫你的項目。
+0

添加Q_OBJECT後會出現一個錯誤:「未定義引用」vtable for Label'「。並有「main.moc:沒有這樣的文件或目錄」 – Kamerton

+0

忘了說這個錯誤出現在構造函數中。 – Kamerton

+0

不幸的是,它根本沒有幫助 – Kamerton

0

嘗試從連接調用中獲取返回值,並檢查其是否爲true或false。 將Q_OBJECT宏添加到派生類的開頭。 添加一些調試輸出到您的插槽像

qDebug()<<"This is my slot."; 

也許這將有助於得到遠一點。

此致

0

class Label : public QLabel 
{ 

添加Q_OBJECT然後你應該

要麼地方你Label類聲明後main函數聲明中.h文件#include "main.moc"