发出信号时会多次调用时隙

slot is called multiple times when signal is emitted

本文关键字:调用 时隙 信号      更新时间:2023-10-16

考虑如下函数:

class1::class1()
{
    class3 obj3 = new class3(this);
}
void class1::function1()
{
    class2 *obj2 = new class2();
    connect(obj3, SIGNAL(sig()), obj2, SLOT(slt()));
}
void class3::function2()
{
    emit sig();
}

我多次调用函数 1()。函数 2() 也被多次触发

我想要的是,每当发出 sig() 时都应该调用 slt(),但是正在发生的事情是,第一次发出 sig() 时,slt() 被调用的次数是 function1() 被调用的次数。下次调用 sig() 时,不会调用 slt()。如果有人能帮助我实现这一目标,那将是一个很大的帮助......

你应该只调用connect一次。 将调用connect的代码移动到仅调用一次的其他函数。

所以我不确定你是否了解你在做什么或你想要什么。所以我会解释正在发生的事情,然后我们可以重新考虑你想要什么。Qt正在按预期工作。您说您希望在发出信号时调用该插槽。这正是您的代码正在做的事情。

现在的问题是...您是否知道每次调用函数 1 时都会创建类 2 的新实例?您确定您不只是想要 class2 的单个实例吗?因为这会以您想要的方式表现得更多。

class2 *obj = 0;
void class1::function1()
{
    if(!obj)
    {
        obj = new class2();
        connect(this, SIGNAL(sig()), obj, SLOT(slt()));
    }
}
void class2::function2()
{
    emit sig();
}

由于我不知道您在哪里创建 class1 的对象,因此我只是根据您提供给我们的内容为您提供了一些东西。这应该以您想要的方式运行。如果这让你感到困惑,我建议你应该谷歌一些关于学习C++或面向对象编程(OOP)的教程。不幸的是,我不能向你推荐任何书籍/教程,否则我会。

我希望这对你有所帮助。