在发出信号时多次调用slot

时间:2016-07-14 05:45:31

标签: c++ qt

考虑以下功能:

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();
}

我多次调用function1()。 function2()也被多次触发

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

现在的问题是......你是否意识到每次调用function1时都会创建class2的新实例?你确定你不只是想要一个class2的实例吗?因为那样会以你想要的方式表现得更多。

String password = "spK47@wF";
    MessageDigest md;
    try {
        md = MessageDigest.getInstance("MD5");
        md.update(password.getBytes("UTF8"));
        byte[] digestedPwdBytes = md.digest();
        Base64 encoder = new Base64();
        System.out.print(new String(encoder.encode(digestedPwdBytes)) +":");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } 

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

我希望这会对你有所帮助。