gpt4 book ai didi

c++ - 不同类中的 Qt 信号和槽

转载 作者:太空狗 更新时间:2023-10-29 20:05:52 24 4
gpt4 key购买 nike

我有一个带插槽的 X 类和一个带信号的 Y 类。我正在从类 X 建立连接,并在类 Y 中创建一个公共(public)方法以从类 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 是 Singleton :

如果您执行 connect( Y::getInstance(), ... )

Y::getInstance() 在某个点执行 new Y(),然后在连接 之前调用 Y 的构造函数已成立。这样,信号将被发射,但插槽还不会收听它。

除此之外,最好执行以下操作之一,尽管您无法使用这些方法在 Y 的构造函数中发出信号:

  • 使用知道 X 和 Y 的第三类 Z,并在那里进行连接
  • 依赖注入(inject)。这意味着 X 在其构造函数中获得了 Y 的一个实例:

依赖注入(inject)构造函数示例:

X::X( Y* const otherClass )
{
connect( otherClass, SIGNAL( ... ), this, SLOT( ... )
}

关于c++ - 不同类中的 Qt 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10896056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com