2016-11-14 15 views
1

私はC++でQtフレームワークを学ぼうとしています。私はシグナルとスロットの理解の真っ只中ですが、カスタマイズしたスロットを作成するのは苦労しています。 updateMessage()は私テスト内公共スロットとして宣言されてQT C++ - 信号とスロット:SLOT関数がクラスにもありますが、 "このようなスロットはありません..."

QObject::connect: No such slot QLabel::updateMessage() in main.cpp:28

クラス

、次のとおりです私はいくつかのチュートリアルに従うように、私のプログラムは、次のようなエラーになってしまいました私のコードからいくつか抜粋:

TEST.H

class Test : public QObject 
{ 
    Q_OBJECT 
public: 
    Test(void); 
    ~Test(void); 
    void setMessage(char *tMsg); 
    char* getMessage(); 

    QWidget *window; 
    QGridLayout *layout; 
    QLabel *lblMsg; 
    QPushButton *btnShow; 


public slots: 
    void updateMessage(); 

private: 
    char msg[80]; 
    QString str; 

}; 

main.cppに

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    Test t; 
    t.window->setWindowTitle("Testing Qt"); 
    t.window->setLayout(t.layout); 
    t.window->show(); 
    return app.exec(); 
} 

Test::Test(void) 
{ 
    window = new QWidget; 
    lblMsg = new QLabel; 
    btnShow = new QPushButton("Show message"); 

    connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage())); 
    layout = new QGridLayout; 
    layout->addWidget(lblMsg); 
    layout->addWidget(btnShow); 

    char str1[] = "Hello, Qt World!"; 
    setMessage(str1); 
} 


Test::~Test(void) 
{ 

} 

void Test::setMessage(char *tMsg) 
{ 
    memcpy(msg, tMsg, sizeof(msg)); 
} 

char* Test::getMessage() 
{ 
    return msg; 
} 

void Test::updateMessage() 
{ 
    string strMsg(getMessage()); 
    QString qstr = QString::fromStdString(strMsg); 
    lblMsg->setText(qstr); 
    delete msg; 
} 

HelloQtWorld.pro

###################################################################### 
# Automatically generated by qmake (3.0) Tue Nov 15 00:30:22 2016 
###################################################################### 

TEMPLATE = app 
TARGET = HelloQtWorld 
INCLUDEPATH += . 

# Input 
HEADERS += stdafx.h Test.h 
SOURCES += anotherClass.cpp \ 
      main.cpp \ 
      stdafx.cpp \ 
      GeneratedFiles/qrc_helloqtworld.cpp 
RESOURCES += helloqtworld.qrc 

も誰かがシグナルとスロットがどのように機能するかを私に説明しようとすることはできますか?前もって感謝します。 :)

答えて

2

問題は、この行である:

connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage())); 

あなたのクラスのスロットではなく、QLabelのスロットで接続しています。

これは

connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage())); 

に変更する必要があり、シグナルとスロットのための新しいQtの5構文に注意してください。

+0

こんにちは。答えてくれてありがとう。それは今働いている。また、信号とスロットに関する参考文献を共有してくれてありがとう。それは有り難いです。ありがとうございます。 :) –

+0

@ZMarsようこそ – demonplus

1

labelQLabelupdateMessage()という名前のスロットがありません。あなたのクラスTestには があります。

変更に接続します。

connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage())); 

これはあなたのTestオブジェクトs updateMessage`スロットにボタンのclicked信号を接続します。

あなたのスロットは Testクラス、ない QLabelクラスで宣言されていますが、それがで宣言されたかのようにスロットに接続しようとしている
+0

こんにちは。私を助けてくれてありがとう。だから私はなぜそれが動作していないか理解しています。 3番目のパラメータは、スロットが宣言された/配置されているクラスでなければなりません。ありがとうございます! :) –

1

QLabel:あなたは

connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage())); 

thisにコネク、代わりのlblMsg必要があります:

connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage())); 
+0

こんにちは。今私はそれが動作していない理由を理解する。助けてくれてありがとう。 :) –

関連する問題