Qt 无法将信号连接到其他类中的插槽
我有两门课。A类和B类。我从A类发出一个信号,希望B类接收 我是按照这样做的 在侦听器文件中Qt 无法将信号连接到其他类中的插槽,qt,signals,slot,Qt,Signals,Slot,我有两门课。A类和B类。我从A类发出一个信号,希望B类接收 我是按照这样做的 在侦听器文件中 Header File: Class Listener:public DDSDataReaderListener { //Some code public: A m_objectSendData; } 实施文件: void Listener::ondataavailable(DDSDataReader *reader) { m_objSendDat
Header File:
Class Listener:public DDSDataReaderListener
{
//Some code
public:
A m_objectSendData;
}
实施文件:
void Listener::ondataavailable(DDSDataReader *reader)
{
m_objSendData.GetDDSData();
}
A班
头文件:
Class A:public QObject
{
Q_OBJECT
public:
void GetDDSData();
signals:
void Signal_Data();
}
.cpp文件
A::A(QWidget *parent):QObject(parent)
{
}
void A::GetDDSData()
{
emit Signal_Data();
}
B班
Header File:
Class B:public QObject
{
Q_Object
public:
A objGetData;
public slots:
void getData();
}
Implementation File:
B::B(QWidget *parent):QObject(parent)
{
//Some part of code
connect(&objGetData,SIGNAL(Signal_Data()),this,SLOT(getData());
}
void B::getData()
{
//Watever is to be updated
}
我试过调试。直到正确发射零件为止。但是,它没有到达插槽。
谁能帮我一下吗。
谢谢。如果没有完整的代码,很难确定问题的确切原因,因此我将概述一些需要检查的要点 为了确保可以使用信号和插槽机制,您应该确保您的类是从QObject派生的,或者是从其层次结构中的QObject派生的类,并且您的类必须包含Q_OBJECT宏,例如:-
class A : public QObject // derived from QObject
{
Q_OBJECT // your class must have this macro for signals and slots
public:
A();
};
省略宏可能是最常见的错误
要指定插槽,请将其添加到类的“公用”或“专用”插槽部分:-
class B : public QObject // derived from QObject
{
Q_OBJECT // your class must have this macro for signals and slots
public:
B();
public slots:
void SlotB(); // slot declared public
private slots:
void SlotBPrivate(); // slot declared private.
};
在类中声明信号后,接收信号的插槽应与传入的参数匹配,并且在将信号连接到插槽时,不得添加函数参数名称
因此:-
connect(&objectA, SIGNAL(SignalA(int in), this, SIGNAL(SlotA(int param)); //will fail due to the argument names
应该是:-
connect(&objectA, SIGNAL(SignalA(int), this, SIGNAL(SlotA(int));
最后,如果您使用的是Qt5,那么可以使用新的连接调用,它不需要您指定任何参数,而是获取插槽和信号函数的地址
connect(&objectA, &A::SignalA, this, &B::SlotA));
因为它引用函数的地址,所以实际上,函数不需要被归类为插槽,并且仍然会被调用
希望能有所帮助。事实上,我相信其中一条评论给出了答案
还有一件事,您并没有显示足够的代码,但我怀疑您的程序离开了objectA变量的作用域,并且您的发射对象在发出任何信号之前就被销毁了(objectA是在堆栈上而不是在堆上创建的局部变量)一小时前的马瑞克R 您在堆栈上分配您的对象,所以一旦它超出范围,它就会被销毁,同时销毁它与它连接到的所有信号/插槽断开连接
这就是为什么你看不到任何错误/警告消息,因为代码本身是完全合法的。您应该新建()对象以将其分配到堆中。您运行应用程序时是否收到过类似于
对象::连接:没有这样的插槽B::SlotB()
的消息?没有,它没有显示任何这样的消息。除了之前丢失的)之外,我看不到您上面发布的代码中有任何错误。
代码>在connect
语句中,但在实际代码中显然没有丢失。检查布尔值connect
返回值。如果它是true
,则连接成功,您只是不发出信号。如果它返回false
则检查@Merlin069给您的答案。还有一件事,您没有显示足够的代码,但我怀疑您的程序离开了objectA
变量的作用域,并且您的发射对象在发出任何信号之前就被销毁了(objectA
是在堆栈上而不是在堆上创建的局部变量).我也是这样做的。我仍然不明白问题是什么。我的函数和插槽都是公共的。那么你能为这个问题添加更多的代码吗,比如你在哪里声明插槽和信号的头文件。还请注意,当使用调试器运行应用程序且连接调用失败时,输出窗口中将显示一个错误。请也贴出来。我会向你解释我正在做的整个场景。我有一个DDS监听器,在这里我调用QT函数。从这个函数中,我将发出一个信号,该信号将发送到我的主线程插槽。这里我更新来自DDS的值。我已经包括了所有的头文件,没有太多的代码要写。这正是我写的。我唯一能做的补充就是在我的侦听器中创建一个类A的对象并调用函数。这是我在Listener做的唯一一件事。在调试时,它说在断点3处停止,断点3位于connect语句处。很抱歉,虽然你说你已经包含了所有代码,但你显然没有,因为没有类的定义,没有Q_对象宏,没有信号或插槽标签等。虽然你可能认为你已经提供了所有必要的信息,在这里继续下去是不够的。你需要展示代码,让我们理解它的上下文,并帮助你解决你的问题,而不是你的问题,例如,“在类A中…”。我可以向您展示代码“a=4”,告诉您它正在崩溃,但您不知道“a”是什么,以及它周围的代码,您不知道为什么。我将它用作成员变量,但它不起作用。所以在这种情况下,它应该堆起来。我会编辑并编写完整的代码。我想问题是我的中产阶级不是单身阶级。我将尝试使其成为单例,然后在这里编辑解决方案。。。