我有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
}
我试过调试。它会发射到正确的部分。然而,它没有到达插槽。 有人可以帮我这个。 谢谢。
答案 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()你的对象将它分配到堆中。