如何将 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 指出了正确的方向。
这主要是为了清理我的构造函数中的一堆代码。仅在构造函数中我就有大约 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 指出了正确的方向。