6

我有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
  }

我尝试调试。直到正确发射部分。但是它没有到​​达插槽。有人可以帮我解决这个问题。谢谢你。

4

2 回答 2

15

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

为了确保您可以使用信号和槽机制,您应该确保您的类是从 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));

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

希望有帮助。

于 2013-08-07T07:42:31.457 回答
0

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

还有一件事,您没有显示足够的代码,但我怀疑您的程序离开了 objectA 变量的范围,并且您的发射对象在它可以发出任何信号之前就被销毁了(objectA 是在堆栈上而不是在堆上创建的局部变量)。– Marek R 1 小时前

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

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

于 2013-08-07T09:46:48.677 回答