所以我试图用C ++学习Qt Framework。我正在理解信号和插槽,但我很难创建自定义插槽。因此,当我按照一些教程时,我的程序最终出现以下错误:
QObject :: connect:main.cpp中没有这样的插槽QLabel :: updateMessage()
在测试类
中将 updateMessage()声明为公开广告位以下是我的代码中的一些代码:
Test.h
w2.handler.postDelayed(new Runnable()
{
@Override
public void run()
{
System.out.println("hello");
}
}, 1000);
的main.cpp
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;
};
HelloQtWorld.pro
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;
}
还有人可以尝试向我解释信号和插槽的工作原理吗?先感谢您。 :)
答案 0 :(得分:2)
问题出在这一行:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您正在使用QLabel
的插槽而不是班级的插槽进行连接。
这应该改为
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
注意信号和插槽的新Qt 5语法。
答案 1 :(得分:1)
label
类型QLabel
没有名为updateMessage()
的广告位。
您的班级Test
有。
将连接更改为:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));
这会将按钮的clicked
信号连接到Test
对象s
updateMessage`广告位。
答案 2 :(得分:1)
您的广告位是在Test
类声明,而不是QLabel
类,但您正尝试连接到插槽,就好像它是在QLabel
声明的那样:
connect(btnShow,SIGNAL(clicked()),lblMsg,SLOT(updateMessage()));
您应该连接到this
,而不是lblMsg
:
connect(btnShow,SIGNAL(clicked()),this,SLOT(updateMessage()));