输入没有括号的函数参数

时间:2014-08-11 14:40:52

标签: c++ qt

我正在使用Qt,我正在尝试将gui上的按钮连接到静态功能。 Qt中执行此操作的函数具有

的语法
connect(sender, &Sender::valueChanged, someFunction);

所以我的代码看起来像

QObject::connect(w.doneButton,&QPushButton::on_doneButton_pressed,getList);

问题是getList需要输入参数

QList<DeviceWidget*>* getList(Window w)
{
    return w.getList();
}

如果我用getList(w)替换getList,我得到一个回复​​,说它无法处理()运算符。

'operator()' is not a member of 'QList<DeviceWidget*>*' return connect_functor(sender,signal,context,slot,&Func2::operator(),type);}

必须有办法解决这个问题。 Qt的设计师不会有这样的限制,但我已经在互联网上搜索了几天,我似乎找不到任何东西。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

(我觉得)解决问题的惯用方法是使用boost::bind()std::bind()(如果你正在使用c ++ 11),正如@Nim所建议的那样在评论中。

例如:

#include <boost/bind.hpp>
QObject::connect(w.doneButton, &QPushButton::on_doneButton_pressed, boost::bind(getList, w));

#include <functional>
QObject::connect(w.doneButton, &QPushButton::on_doneButton_pressed, std::bind(getList, w));

在c ++ 11中你也可以使用lambda函数(虽然bind更适合绑定参数):

QObject::connect(w.doneButton, &QPushButton::on_doneButton_pressed, [w]{ getList(w); });

如果你既不能使用c ++ 11也不能使用Boost,你可以回归到一个仿函数(这有点麻烦,基本上是lambda在c ++ 11中为你做的):

class getListProxy
{
public:
    getListProxy(Window w) : m_w(w) {}

    QList<DeviceWidget*>* operator()() {
        return getList(m_w);
    }

private:
    Window m_w;
};

QObject::connect(w.doneButton, &QPushButton::on_doneButton_pressed, getListProxy(w));


另请注意,所有这些构造都会按值w传递,因为getList(Window w)按值w传递。根据{{​​1}}的实施情况,这可能不是您想要的。

答案 1 :(得分:1)

将按钮on_doneButton_pressed连接到另一个插槽函数,然后从该插槽函数中调用getList。这样,您可以将窗口传递给getList。

QObject::connect (w.doneButton, &QPushButton::on_doneButton_pressed, &someFunction);

void Window::someFunction()
{
    getList(this);
}