QT C ++ - 信号和插槽:“没有这样的插槽QLabel ...”甚至SLOT功能都存在于我的课堂上

时间:2016-11-14 16:47:36

标签: c++ qt qt5 signals-slots

所以我试图用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;
}

还有人可以尝试向我解释信号和插槽的工作原理吗?先感谢您。 :)

3 个答案:

答案 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()));