Qt 无法将信号连接到其他类中的插槽

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

我有两门课。A类和B类。我从A类发出一个信号,希望B类接收

我是按照这样做的

在侦听器文件中

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”是什么,以及它周围的代码,您不知道为什么。我将它用作成员变量,但它不起作用。所以在这种情况下,它应该堆起来。我会编辑并编写完整的代码。我想问题是我的中产阶级不是单身阶级。我将尝试使其成为单例,然后在这里编辑解决方案。。。