无法将信号连接到另一个类的插槽

Sid*_*411 5 qt signals slot

我有2节课.A级和B级.我发出A级信号,我希望B接收.

我是这样做的

在监听器文件中

Header File:
  Class Listener:public DDSDataReaderListener
  {
     //Some code
    public:
       A m_objectSendData;
  }
Run Code Online (Sandbox Code Playgroud)

实施档案:

  void Listener::ondataavailable(DDSDataReader *reader)
 {
  m_objSendData.GetDDSData();
 }
Run Code Online (Sandbox Code Playgroud)

在A班

头文件:

Class A:public QObject
{
  Q_OBJECT
  public:
    void GetDDSData();
  signals:
    void Signal_Data();
}
Run Code Online (Sandbox Code Playgroud)

.cpp文件

 A::A(QWidget *parent):QObject(parent)
{
}

void A::GetDDSData()
 {
   emit Signal_Data();
 }   
Run Code Online (Sandbox Code Playgroud)

在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
  }
Run Code Online (Sandbox Code Playgroud)

我试过调试.它会发射到正确的部分.然而,它没有到达插槽.有人可以帮我这个.谢谢.

The*_*ght 12

如果没有完整的代码,很难确定问题的确切问题,因此我将概述一些要检查的重点.

为确保您可以使用信号和插槽机制,您应确保从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();
};
Run Code Online (Sandbox Code Playgroud)

省略宏可能是最常见的错误.

要指定插槽,请将其添加到班级的公共或私人插槽部分: -

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.
}; 
Run Code Online (Sandbox Code Playgroud)

一旦在类中声明了一个信号,接收信号的插槽应与传入的参数匹配,当您将信号连接到插槽时,不得添加函数参数名称.

因此: -

connect(&objectA, SIGNAL(SignalA(int in), this, SIGNAL(SlotA(int param)); //will fail due to the argument names
Run Code Online (Sandbox Code Playgroud)

它应该是: -

connect(&objectA, SIGNAL(SignalA(int), this, SIGNAL(SlotA(int));
Run Code Online (Sandbox Code Playgroud)

最后,如果你使用的是Qt 5,你可以使用新的连接调用,它不需要你指定任何参数,而是使用槽和信号函数的地址.

connect(&objectA, &A::SignalA, this, &B::SlotA));
Run Code Online (Sandbox Code Playgroud)

由于它引用了函数的地址,实际上,函数不需要被归类为一个槽,仍然会被调用.

希望有所帮助.