2017-08-03 9 views
0

私はQLabelから継承したクラスを作成しました。このクラスには公開スロットがあり、ラベルのキャプションを変更する必要があります。私はclicked()SIGNALボタンのでこれSLOT "コール"。 ボタンを押すと何も起こりませんでした。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

、任意のcppに手動MOCファイルをインクルードする必要があり、このようにmain.cppにでたり、可能であれば 'QObject'派生クラスを宣言しないでください。 – dtech

答えて

2

認識すべき信号とスロットのために、クラスは、プライベート部分にQ_OBJECTマクロを使用しなければなりません。

もう1つのことは、"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. 押します。
  2. は、同じメニューでqmakeを実行します。
  3. そして、あなたは自分のプロジェクトを構成します。
+0

Q_OBJECTを追加した後、エラーが発生しました: "未定義の' vtable for Label '"。そして、 "main.moc:そのようなファイルやディレクトリはありません" – Kamerton

+0

このエラーがコンストラクタに表示されることを忘れました。 – Kamerton

+0

残念ながら、それは全く役に立ちません – Kamerton

0

は、真または偽のためにそれをチェック呼び出すあなたの接続からの戻り値を取得しよう。 派生クラスの先頭にQ_OBJECTマクロを追加します。 は多分これは少しさらに得るために役立つだろう

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

のようなあなたのスロットにいくつかのデバッグ出力を追加します。

よろしく

0

class Label : public QLabel 
{ 

Q_OBJECTを追加して、あなたは

いずれかmain関数宣言の後に.hファイルまたは書き込み#include "main.moc"から場所あなたLabelクラス宣言をする必要があります。一般的なルールとして

関連する問題