1

我正在尝试将信号重新连接到同一个插槽但使用不同的参数。如果我只想在不使用参数或 lambda 函数的情况下将相同的信号重新连接到不同的插槽,这将起作用,但我需要这样做。

起初我尝试过这样的事情:

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

function1收到varA并且从不varB

我通过保留连接列表找到了一种方法,当我想修改参数时,我只需断开旧连接并建立新连接。

我想知道的是,是否有一种方法可以进行此修改,而无需跟踪所有连接并完成disconnect/connect 过程。

4

2 回答 2

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);
于 2017-03-23T15:47:34.610 回答
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);
      }
    };
    
于 2017-03-23T16:07:58.977 回答