QT C++ - 信号和槽:"No such slot QLabel..." 甚至 SLOT 函数也存在于我的 class
QT C++ - Signals and Slots: "No such slot QLabel..." even the SLOT function is existing in my class
所以我正在尝试用 C++ 学习 Qt Framework。我正在了解信号和插槽,但我很难创建自定义插槽。因此,当我按照一些教程进行操作时,我的程序出现了以下错误:
QObject::connect: No such slot QLabel::updateMessage() in main.cpp:28
其中 updateMessage() 在我的 Test[=36 中被声明为 public 插槽 =] class
以下是我的代码片段:
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
还有谁能帮我解释一下信号和槽是如何工作的吗?先感谢您。 :)
您的 label
类型 QLabel
没有名为 updateMessage()
的插槽。
你的 class Test
有。
将连接更改为:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
这会将按钮的 clicked
信号连接到您的 Test
对象s
updateMessage` 插槽。
您的插槽是在 Test
class 声明的,而不是 QLabel
class,但您正在尝试连接到插槽,就好像它是在 QLabel
:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您应该连接到 this
,而不是 lblMsg
:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
问题出在这一行:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您正在连接 QLabel
的插槽,而不是 class 的插槽。
这应该改为
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
注意信号和槽的新 Qt 5 语法。
所以我正在尝试用 C++ 学习 Qt Framework。我正在了解信号和插槽,但我很难创建自定义插槽。因此,当我按照一些教程进行操作时,我的程序出现了以下错误:
QObject::connect: No such slot QLabel::updateMessage() in main.cpp:28
其中 updateMessage() 在我的 Test[=36 中被声明为 public 插槽 =] class
以下是我的代码片段:
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
还有谁能帮我解释一下信号和槽是如何工作的吗?先感谢您。 :)
您的 label
类型 QLabel
没有名为 updateMessage()
的插槽。
你的 class Test
有。
将连接更改为:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
这会将按钮的 clicked
信号连接到您的 Test
对象s
updateMessage` 插槽。
您的插槽是在 Test
class 声明的,而不是 QLabel
class,但您正在尝试连接到插槽,就好像它是在 QLabel
:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您应该连接到 this
,而不是 lblMsg
:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
问题出在这一行:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您正在连接 QLabel
的插槽,而不是 class 的插槽。
这应该改为
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
注意信号和槽的新 Qt 5 语法。