在QT中使用Signal和Slot时无法接收数据
Cannot receive data when using Signal & Slot in 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";
}
当我运行应用程序时,我没有看到消息"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
对象,用户似乎会更新地看到它,并且不会调用任何方法,因此不会发出任何信号。
当您希望使用信号在表单之间发送数据时,它应该如下所示:
您有Form1
和Form2
对象,这两个对象都已创建,并且可能对用户同时可见
然后调用connect()
将Form1
的信号连接到Form2
的插槽
然后您在Form1
中发送emit
信号,因此调用Form2
的插槽并传输数据
如果您的表单不打算同时出现在屏幕上,只需在Form1
中创建Form2
时发送数据,而不需要信号和插槽。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 在QT中使用Signal和Slot时无法接收数据