2017-03-23 27 views
1

我试图将信号重新连接到同一个插槽,但使用不同的参数。如果我只是想在不使用参数或lambda函数的情况下将相同的信号重新连接到不同的插槽,但我需要这样做,这将工作。Qt - 使用lambda函数修改上一个连接信号的插槽参数

起初,我想是这样的:

connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varA);}); 
connect(remove_btn,&QPushButton::clicked,[this, id] {function1(varB);}); 

function1接收varA永不varB

我找到了一种方法来做到这一点,保持一个连接列表,当我想修改参数时,我会断开旧连接并建立新连接。

我想知道的是,如果有一种方法可以在不需要跟踪所有连接并进行discconnect/connect过程的情况下进行修改。

+0

@AlexanderVX忘记 “ID” 变种。我忘了从我的例子中删除它,这是无关紧要的。关于你的例子我不确定你试图给我看,但两个连接都有相同的参数,这不是我的问题。不过谢谢。 – RubenC

回答

0

两种解决方案来我的脑海:

  1. 通过引用捕获var并更改它而不是重新连接:

    class Foo : public QWidget { 
        Q_OBJECT 
        int remove_btn_var; 
        int varA = 10, varB = 20; 
        QPushButton remove_btn; 
        void function1(int); 
    public: 
        Foo() { 
        remove_btn_var = varA; 
        connect(&remove_btn, &QPushButton::clicked, [&] { function1(remove_btn_var); }); 
        } 
        void switch() { 
        remove_btn_var = varB; 
        } 
    }; 
    
  2. 一个属性添加到您可以修改按钮:

    static const char k_function1_var[] = "function1_var"; 
    class Foo : public QWidget { 
        Q_OBJECT 
        int varA, varB; 
        QPushButton remove_btn; 
        void function1(int); 
    public: 
        Foo() { 
        remove_btn.setProperty(k_function1_var, varA); 
        connect(&remove_btn, &QPushButton::clicked, [this] { 
         function1(remove_btn.property(k_function1_var).toInt()) 
        }); 
        } 
        void switch() { 
        remove_btn.setProperty(k_function1_var, varB); 
        } 
    }; 
    
+0

我想出了一个基于你的想法的解决方案。我的类有一个变量,其中包含id号(让它命名为'var_id') 现在我只是使用'connect(remove_btn,&QPushButton :: clicked,[this] {function1(myClass-> var_id);});' 并且改变'function1()'里面的'var_id'值,这样就改变了connect价值 这个想法以前有点过头,但不知何故,我忽略了它,谢谢你的帮助。 – RubenC

0

您可能能够使用std::bind,因为QPushButton::clicked信号有1个参数(bool checked),它应该是足够使用:

auto f = std::bind(function1, varA); // checked argument ignored (std::placeholders::_1) 
connect(remove_btn,&QPushButton::clicked,f); 
+0

bind()不起作用,它给了我错误“没有重载的bind()...的实例),但是我用相应的正确参数来使用它,我甚至检查了其他例子,也许这是我的项目但无论如何,我发现我的问题的解决方案,谢谢@xander – RubenC