2016-11-14 49 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

你好。现在我明白为什么它不起作用。十分感谢你的帮助。 :) –