如何将 std::function 或函数指针传递给 qtconnect?

How to pass a std::function or a function pointer into qtconnect?

这主要是为了清理我的构造函数中的一堆代码。仅在构造函数中我就有大约 20 多行 connect(object, func1, this, func2),我试图通过使用 std::vector<std::tuple<QObject*,std::function<void()>,std::function<void>>>> connections;

来清理代码

如果我能做类似的事情,效果会很好:

std::vector<std::tuple<QObject*,std::function<void()>,std::function<void>>>> connections = {
  std::make_tuple(mySlider, std::bind(&QSlider::sliderReleased,mySlider, std::bind(&Foo::onSliderChanged,this)),
  .
  .
  .
};

然后这样称呼它:

for(auto &&e : connections)
  connect(std::get<0>(e),std::get<1>(e),this,std::get<2>(e));

但是,当我这样做时,我得到一个错误,指出替换失败并且 std::function<void()> 无法转换为函数指针。因此决定对其进行更改并创建如下所示的实际函数指针:

typename void(Foo::*fooFunc)();
typename void(QSlider::*sliderFunc)();

std::vector<std::tuple<QObject*,sliderFunc,fooFunc>> sliderConnections = {
  std::make_tuple(mySlider, &QSlider::sliderReleased, &Foo::onSliderChanged),
  .
  .
  .
};

同样的事情,然后我尝试调用它:

for(auto &&e : sliderConnections)
  connect(std::get<0>(e),std::get<1>(e),this,std::get<2>(e));

然而,这也会在没有转换的情况下提供类似的错误。这没有任何意义,因为现在我实际上使用的是函数指针。根据the connection documentation应该可以用一个函数指针来连接它们。所以要么我错误地传递了它。或者我想要实现的目标是不可能的。

如有任何帮助,我们将不胜感激!

看了 G.M 的评论后,我意识到他们是正确的。 QObject* 不是 QSlider*,因此在尝试调用函数 QSlider::sliderReleased 时无法连接两者,因为 QObject 没有滑块。因此,一旦我在元组向量中更改了它,代码就可以正常编译了。

例如:

typedef void(Foo::*fooFunc)();
typedef void(QSlider::*sliderFunc)();
typedef void(QSpinBox::*spinFunc)();

const std::vector<std::tuple<QSlider*, sliderFunc, fooFunc>> sliderConnections = {
  std::make_tuple(slider1, &QSlider::sliderReleased, &Foo::onSlider1Changed),
  std::make_tuple(slider2, &QSlider::sliderReleased, &Foo::onSlider2Changed),
  std::make_tuple(slider3, &QSlider::sliderReleased, &Foo::onSlider3Changed)
};

const std::vector<std::tuple<QSpinBox*, spinFunc, fooFunc>> spinConnections = {
  std::make_tuple(spin1, &QSpinBox::editingFinished, &Foo::onSpin1Changed),
  std::make_tuple(spin2, &QSpinBox::editingFinished, &Foo::onSpin2Changed),
  std::make_tuple(spin3, &QSpinBox::editingFinished, &Foo::onSpin3Changed)
};

无论您负责什么 class,这些都是私人成员。然后在构造函数中,而不是有 6 行 connect(object,SIGNAL,object,SLOT),然后你可以将它们放入一个函数中并像这样调用它们:

for(auto && tup : sliderConnections)
  connect(std::get<0>(tup),std::get<1>(tup),this,std::get<2>(tup));

这成功地将所有对象连接到它们适当的函数。同样,这是个人喜好。我只是想知道是否有办法 G.M 指出了正确的方向。