2017-08-03 76 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"