我有两个由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”。我的申请是错的吗?
你有什么想法吗?
谢谢!
答案 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
对象,看起来用户会更新看到它,并且不会调用任何方法,因此不会发出任何信号。
当您想使用信号在表单之间发送数据时,它应如下所示:
您拥有Form1
和Form2
个对象,两者都已创建,并且可能同时对用户可见。
然后,您拨打connect()
将Form1
的信号连接到Form2
的插槽
然后,您emit
发出Form1
信号,因此调用Form2
的广告位并传输数据
如果您的表单无法同时显示在屏幕上,只需在Form2
中创建Form1
时发送数据,而无需信号和广告位。