c++ - 输入不带括号的函数参数

标签 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 设计者不会设置这样的限制,但我已经在互联网上搜索了几天,但似乎找不到任何东西。

感谢您的帮助!

最佳答案

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

例如:

#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 更适合绑定(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。根据 Window 的实现,这可能不是您想要的。

关于c++ - 输入不带括号的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245947/

相关文章:

c++ - 如何在没有外部库的情况下使用 C++03 约束执行基于正则表达式的字符串操作?

android - Qt 安卓 : Pressing "Done" does not hide the keyboard

c++ - 使用指针设置 8 位灰度图像的像素颜色

c++ - 防止 Windows 程序将 ^Z 解释为文件结尾

c++ - 尝试初始化位于区域结构内的边缘结构。我怎么做?

c++ - 如何在 Xcode 上设置文件以仅在设备上构建而不在模拟器上构建?

c++ - 在 C++ 标准中的什么地方可以找到对在全局范围内调用函数的支持?

java - 是否可以通过图形用户界面 (GUI) 与 Linux 命令行界面 (CLI) 交互?

qt - Simple Qt code for network 简单网络连接

c++ - QDomNode.clear() 不会删除 xml 标记的值