使用Signal&时无法接收数据QT中的插槽

时间:2013-07-17 05:17:46

标签: c++ qt

我有两个由QT Creator创建的表单。我使用过Signal&用于在这两个表单之间传输数据的插槽。但我无法收到任何数据。

这些是我申请中的两种表格

Form1.h

class Form1: public QDialog
{

...........

private slots:
    void on_btnOK_clicked();

signals:
    void SendId(int id);
};

Form1.cpp

#include "form2.h"

void Form1::on_btnOK_clicked()
{
   emit SendId(2);            //ID = 2

   Form2 form2;
   form2.setModal(true);
   form2.exec();
}

Form2.h

class Form2 : public QDialog
{

...........

public slots:
   void ReceiveId(int id);
private:
   Form1* m_pForm1;
};

Form2.cpp

Form2::Form2(QWidget *parent) :
QDialog(parent),
ui(new Ui::Form2)

{
   ui->setupUi(this);
   m_pForm1 = new Form1(this);

    // Connecting the signal we created in the Form1
    // with the slot created in the Form2
    QObject::connect(m_pForm1, SIGNAL(SendId(int)),
                     this, SLOT(ReceiveId(int)));
}

void Form2::ReceiveId(int id)
{
    qDebug() << "Received id";
}

当我运行应用程序时,我看不到消息“已接收ID”。我的申请是错的吗?

你有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我想这是因为您正在收听的Form1实例永远不会发出信号。

假设您开始创建Form1的实例,显示它并单击“确定”按钮。然后,Form1的这个实例引发了一个信号,但还没有人在听:

void Form1::on_btnOK_clicked()
{
   emit SendId(2); // No one is listening yet

   Form2 form2;
   form2.setModal(true);
   form2.exec();
}

然后创建并显示Form2实例,其中内部创建另一个Form1实例。 Form2连接到新的Form1 SendId 信号,但此信号永远不会发出,因为新Form1永远不会显示

Form2::Form2(QWidget *parent) :
QDialog(parent),
ui(new Ui::Form2)

{
   ui->setupUi(this);
   m_pForm1 = new Form1(this);  // You're creating a new Form1 instance, but you never show it
    QObject::connect(m_pForm1, SIGNAL(SendId(int)),
                     this, SLOT(ReceiveId(int))); // SendId signal of the new Form1 is never raised
}

答案 1 :(得分:1)

您在发出信号后创建了表单2。并且m_pForm1中的指针是完全新的Form并且没用。像这样改变你的代码:

Form1::Form1()//change your constructor depending on your need
{
   m_pForm2 = new Form2;
   form2->setModal(true);
   connect(this, SIGNAL(sendId(int)), m_pForm2, SLOT(receiveId(int))); 
}

void Form1::on_btnOK_clicked()
{
   m_pForm2->show();
   emit SendId(2);            //ID = 2

}

答案 2 :(得分:1)

我认为你做错了。
你正在Form1的构造函数中创建新的Form2对象,看起来用户会更新看到它,并且不会调用任何方法,因此不会发出任何信号。

当您想使用信号在表单之间发送数据时,它应如下所示:
您拥有Form1Form2个对象,两者都已创建,并且可能同时对用户可见。
然后,您拨打connect()Form1的信号连接到Form2的插槽
然后,您emit发出Form1信号,因此调用Form2的广告位并传输数据

如果您的表单无法同时显示在屏幕上,只需在Form2中创建Form1时发送数据,而无需信号和广告位。