【问题标题】:Wt connect function, passing a parameter to a function which is a connect function argumentWt 连接函数,将参数传递给作为连接函数参数的函数
【发布时间】:2018-01-31 17:11:20
【问题描述】:

以下代码 sn-p 使用带有两个参数的 Wt/C++ 连接。 如何将参数传递给 &mode::func。

button = new WPushButton("func 1", buttons);
stuff()->addWidget(button);
button->clicked().connect(this, &mode::func);

换句话说,如何制作 &mode::func(number)。在下面查看所需的代码。

int number = 5;
button = new WPushButton("func 1", buttons);
stuff()->addWidget(button);
button->clicked().connect(this, &mode::func(number));

【问题讨论】:

    标签: c++ arguments bind wt


    【解决方案1】:

    因为Wt 4即将发布,所以我也会提一下如何在Wt 4中完成。

    对于重量 3:

    如果你像这样连接一个函数,那么mode::func 将被调用,如果它带有一个参数,则使用点击信号的WMouseEvent。你可以改用boost::bind

    int number = 5;
    button = new WPushButton("func 1");
    stuff()->addWidget(button);
    button->clicked().connect(boost::bind(&mode::func, this, number));
    

    如果this 被删除,这仍然会自动断开插槽,就像您的原始代码一样。如果您改用 std::bind(或 lambda),它不会自动断开插槽。

    我从您的原始代码中删除了buttons 参数,因为它将buttons 设置为父级,但随后使用addWidget 将其移动到stuff(),使其成为父级。

    对于重量 4:

    在 Wt 4 中,您必须使用 std::bind 或 lambda 函数。你可以这样做:

    int number = 5;
    button = stuff()->addWidget(std::make_unique<WPushButton>("func 1"));
    button->clicked().connect(bindSafe([this,number]{
      func(number);
    }));
    

    bindSafe 确保在 this 被删除后不调用 lambda。

    如果您不想防止删除this,可以省略bindSafe。在许多实际情况下,buttonthis 之前被删除,从而使bindSafe 变得不必要。

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2021-04-13
      • 1970-01-01
      • 2014-08-13
      • 2016-11-22
      • 2015-03-18
      • 2012-11-17
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多