在QT中使用Signal和Slot时无法接收数据

Cannot receive data when using Signal & Slot in QT

本文关键字:数据 Slot QT Signal      更新时间:2023-10-16

我有两个由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";
}

当我运行应用程序时,我没有看到消息"Received id"。我的申请错了吗?

你有什么想法吗?

谢谢!

您在发出信号后创建了表单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
}

我想这是因为您正在侦听的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连接到新Form1SendId信号,但此信号从未发出,因为此新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
}

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

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

如果您的表单不打算同时出现在屏幕上,只需在Form1中创建Form2时发送数据,而不需要信号和插槽。