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

时间:2013-08-07 07:15:36

标签: qt signals slot

我有2节课。 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
  }

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

2 个答案:

答案 0 :(得分: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();
};

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

要指定广告位,请将其添加到班级的公开或私人广告位部分: -

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));

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

connect(&objectA, &A::SignalA, this, &B::SlotA));

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

希望有所帮助。

答案 1 :(得分:0)

实际上我相信其中一条评论会给出答案。

  

还有一件事,你没有显示足够的代码,但我怀疑你编程留下了objectA变量的范围,你的发射对象在它发出任何信号之前就被破坏了(objectA是在堆栈上创建的局部变量而不是在堆上) 。 - Marek R 1小时前

你在堆栈上分配你的对象,所以一旦它超出范围就会被破坏,同时破坏它会与它连接的所有信号/插槽断开连接。

这就是为什么你没有看到任何错误/警告信息,因为代码本身是完全合法的。你应该new()你的对象将它分配到堆中。