2016-11-14 48 views
1

所以我想用C++學習Qt框架。我處於理解信號和插槽的過程中,但我很難創建一個定製插槽。因此,正如我跟着一些教程,我的節目結束了以下錯誤:QT C++ - 信號和插槽:「沒有這樣的插槽QLabel ...」即使我的班級中存在SLOT功能

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

updateMessage()被聲明爲公有槽測試裏面

以下是

Test.h

0:從我的代碼的某些代碼段

的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的插槽,而不是您班級的插槽。

這應該在新的Qt 5語法信號和槽改爲

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

留意。

+0

你好。謝謝你的答案。它現在正在工作。也感謝您分享一些關於信號和插槽的參考資料。我很感激。 Thankk youuu。 :) –

+0

@ZMars不客氣 – demonplus

1

您的label類型QLabel沒有名爲updateMessage()的插槽。 您的班級Test有。

更改連接到:

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

這將按鈕的clicked信號連接到您的Test對象s updateMessage`插槽。

+0

你好。非常感謝你幫助我。所以現在我明白了它爲什麼不起作用。第三個參數應該是插槽聲明/定位的類,對嗎?謝謝YouUUU! :) –

1

你的插槽在Test類,而不是QLabel類中聲明,但是你要連接到插槽中,如果它是在宣佈QLabel

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

你應該connecto到this,而不是lblMsg

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

你好。現在我明白爲什麼它不起作用。十分感謝你的幫助。 :) –