Qt信号和不同类别的插槽
Qt signals and slots in different classes
我有一个带插槽的X类和一个带信号的Y类。我正在设置来自 X 类的连接,并在 Y 类中创建了一个公共方法来发出来自 X 类的信号(我不确定此步骤是否必要)。
然后,如果我从类 X 调用该方法,则会发出信号并执行插槽。但是如果我从 Y 类发出信号,插槽永远不会执行,我不明白为什么。
我可以在Y班也建立联系吗?
这个伪代码试图解释我想要什么:
class X : public QWidget {
Q_OBJECT
X(){
connect(Y::getInstance(), SIGNAL(updateSignal(int)), this, SLOT(updateStatus(int)));
Y::getInstance().emitSignal(someValue); // Works
}
public slots:
void updateStatus(int value);
}
class Y : public QObject {
Q_OBJECT
Y(){
}
public:
Y getInstance();
void emitSignal(int value) {
emit updateSignal(value);
}
signal:
void updateSignal(int value);
}
class Z : public Y {
Z(){
}
init(){
emitSignal(someValue); // Doesn't work
}
}
请记住,连接不是在类之间,而是在实例之间。如果您发出信号并期望调用连接的插槽,则必须在建立连接的实例上发出该信号。那是你的问题。
假设 Y 是单例:
如果你这样做connect( Y::getInstance(), ... )
并且Y::getInstance()
在某个时候确实new Y()
,则在建立连接之前调用 Y 的构造函数。这样,信号将被发出,但插槽不会侦听它。
除此之外,最好做以下事情之一,尽管使用这些方法无法在 Y 的构造函数中发出信号:
- 使用知道 X 和 Y 的第三类 Z,并在那里进行连接
- 依赖注入。这意味着 X 在其构造函数中获取 Y 的实例:
依赖注入构造函数的示例:
X::X( Y* const otherClass )
{
connect( otherClass, SIGNAL( ... ), this, SLOT( ... )
}
很简单。请参阅以下示例。
如果你想在自己的类中写入信号和插槽,你需要满足两个条件......
1. Your class must inherit from QObject class or any class derived from QObject.
2. The Q_OBJECT macro must appear in a private section in your class.
/* Sender.h */
#ifndef SENDER_H
#define SENDER_H
#include <QObject>
class Sender : public QObject
{
Q_OBJECT
public:
explicit Sender(QObject *parent = 0);
void fireSignal();
signals:
void foo(const QString& arg);
};
#endif // SENDER_H
/* Sender.cpp*/
#include "Sender.h"
Sender::Sender(QObject *parent) :
QObject(parent)
{
}
void Sender::fireSignal()
{
emit foo("This a message sender is sending to receiver.");
}
现在接收器的代码如下
/* Receiver.h */
#ifndef RECEIVER_H
#define RECEIVER_H
#include <QObject>
class Receiver : public QObject
{
Q_OBJECT
public:
explicit Receiver(QObject *parent = 0);
public slots:
void bar(const QString& arg);
};
#endif // RECEIVER_H
/* Receiver.cpp */
#include "Receiver.h"
#include <iostream>
Receiver::Receiver(QObject *parent) :
QObject(parent)
{
}
void Receiver::bar(const QString &arg)
{
std::cout << arg.toStdString();
}
现在主.cpp代码
#include <QtCore/QCoreApplication>
#include "Sender.h"
#include "Receiver.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Sender sender;
Receiver receiver;
QObject::connect(&sender, SIGNAL(foo(QString)), &receiver, SLOT(bar(QString)));
sender.fireSignal();
return a.exec();
}
就是这样。
最后,如果要对连接方法使用另一种语法。请使用以下行
QObject::connect(&sender,&Sender::foo,&receiver,&Receiver::bar);
希望这对你有帮助。谢谢
您正在从构造函数发出信号。那时Y::getInstance()
没有任何意义 根据这个代码片段。
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- QT 插槽未在主线程上调用
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 控制带有信号/插槽的Qt QML滑动视图
- Qt 信号/插槽问题
- QT5 信号不会激活插槽内的功能
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 不同类别的 2 个对象之间的信号/插槽
- Qt:如何将不同类别的静态信号连接到插槽
- Qt信号和不同类别的插槽
- 将信号与不同类别的插槽连接