【问题标题】:Qt - modify slot's parameter of previous connected signal using lambda functionQt - 使用 lambda 函数修改先前连接信号的插槽参数
【发布时间】:2017-03-23 14:25:48
【问题描述】:

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

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

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

function1 接收 varA 并且从不接收 varB

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

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

【问题讨论】:

  • @AlexanderVX 忘记“id”变量。我忘了从我的例子中删除它,这无关紧要。关于您的示例,我不确定您要向我展示什么,但是两个连接都具有相同的参数,这不是我的问题。不过还是谢谢。

标签: c++ qt lambda qt-signals qt-connection


【解决方案1】:

我想到了两个解决方案:

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

【讨论】:

  • 我根据您的想法想出了一个解决方案。我的班级有一个保存 id 号的变量(让我们将其命名为var_id)。现在我将只使用connect(remove_btn, &QPushButton::clicked, [this] { function1(myClass->var_id);}); 并更改function1() 中的var_id 值。这样,它会更改连接值。这个想法之前有点在我的脑海里闪过,但不知何故我忽略了它。感谢您的帮助。
【解决方案2】:

您也许可以使用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);

【讨论】:

  • bind() 不起作用,它给了我错误“没有重载 bind() 的实例...),但我使用正确的参数相应地使用它,我什至检查了其他示例. 也许这与我的项目有关,但无论如何我找到了解决问题的方法,谢谢@xander
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2015-03-14
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多