其他分享
首页 > 其他分享> > c – Qt信号和不同类别的插槽

c – Qt信号和不同类别的插槽

作者:互联网

我有一个带有插槽的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是Singleton

如果你连接(Y :: getInstance(),…)

并且Y :: getInstance()在某个时刻执行新的Y(),然后在建立连接之前调用Y的构造函数.像这样,信号将被发射,但插槽将不会收听它.

除此之外,最好做以下事情之一,尽管你不能使用这些方法在Y的构造函数中发出信号:

>使用知道X和Y的第三类Z,并在那里进行连接
>依赖注入.这意味着X在其构造函数中获取Y的实例:

依赖注入构造函数的示例:

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

标签:c,qt,signals-slots
来源: https://codeday.me/bug/20190729/1572866.html