0

我有 2 个由 QT Creator 创建的表格。我使用 Signal & Slot 在这两种形式之间传输数据。但是我收不到任何数据。

这些是我申请中的两种形式

表格1.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();
}

表格2.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"。我的申请错了吗?

你有什么想法?

谢谢!

4

3 回答 3

1

我想这是因为您正在收听的 Form1 实例从未发出信号。

假设您开始创建 Form1 的实例,显示它并单击 OK 按钮。然后,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
}
于 2013-07-17T05:46:22.177 回答
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

}
于 2013-07-17T05:47:04.550 回答
1

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

当您想使用信号在表单之间发送数据时,它应该如下所示:
您拥有Form1Form2对象,两者都已创建,并且可能同时对用户可见。
然后你调用connect()connectForm1的信号到Form2's slot
然后你emit发出信号Form1,所以Form2's slot 被调用并传输数据
如果你的表单不
打算同时在屏幕上,只需在你创建时发送Form2数据Form1信号和插槽。

于 2013-07-17T06:19:13.617 回答