Qt: QObject::connect: 没有这样的插槽
Qt: QObject::connect: No such slot
我正在构建一个小界面,其中我对 RViz
进行了子类化,它是 ROS. According to the official documentation 的可视化工具,可以重新使用和重新实现此工具中存在的一些功能。我想做的是创建两个不同的 QPushButton
来改变渲染器的视图。
我的两个按钮的 SIGNAL
和 SLOT
有一些问题,事实上当我点击它们时,视图并没有改变。
现在 RViz
有一个名为 getNumViews()
的特定函数,允许用户设置观看次数。就我而言,我有两个视图仅与我正在实施的两个 QPushButton
相关。
当我 运行 应用程序时,我收到以下错误 QObject::connect: No such slot MyViz::switchToView()
并认为所有正确设置 SIGNALS
和 SLOT
的段落都是正确的SIGNAL
和 SLOT
的 official documentation. Also for completeness I am using C++11
and from researching more I found that the old version,我正在使用的 official documentation. Also for completeness I am using C++11
and from researching more I found that the old version 应该仍然有效。
下面我是运行ning的SIGNAL
和SLOT
相关的代码:
myviz.h
public Q_SLOTS:
void switchToView(QString view);
private:
rviz::ViewManager *view_man;
myviz.cpp
MyViz::MyViz(QWidget *parent) : QWidget(parent)
{
// operation in the constructor
QPushButton *topViewBtn = new QPushButton("Top View");
QPushButton *sideViewBtn = new QPushButton("Side View");
connect(topViewBtn, SIGNAL(clicked()), this, SLOT(switchToView(QString("Top View"))));
connect(sideViewBtn, SIGNAL(clicked()), this, SLOT(switchToView(QString("Side View"))));
}
这里是我设置与两个 QPushButtons
相关的 2 个视图可能性的地方
void MyViz::switchToView(QString view)
{
view_man = manager->getViewManager();
for(int i = 0; i<view_man->getNumViews(); i++)
{
if(view_man->getViewAt(i)->getName() == view)
view_man->setCurrentFrom(view_man->getViewAt(i));
return;
std::cout<<"Did not find view named %s"<<std::endl;
}
}
感谢您为解决此问题指明了正确的方向。
您不能使用旧语法在连接函数中传递参数。参数的数量和类型也需要匹配,因此您只能将 clicked
连接到不带参数的函数。如果要使用旧语法,需要定义2个slot
public Q_SLOTS:
void switchToTopView();
void switchToSideView();
然后您可以通过以下方式连接:
connect(topViewBtn, SIGNAL(clicked()), this, SLOT(switchToTopView()));
connect(sideViewBtn, SIGNAL(clicked()), this, SLOT(switchToSideView()));
编辑:
新连接方法的正确语法是:
connect( topViewBtn, &QPushButton::clicked, this, &MyViz::switchToTopView);
这种方法的优点是你还可以绑定到lambdas,它间接让你在连接期间设置参数,所以你可以这样写
connect( topViewBtn, &QPushButton::clicked, [this](){
switchToView( QString("Top View") );
});
我正在构建一个小界面,其中我对 RViz
进行了子类化,它是 ROS. According to the official documentation 的可视化工具,可以重新使用和重新实现此工具中存在的一些功能。我想做的是创建两个不同的 QPushButton
来改变渲染器的视图。
我的两个按钮的 SIGNAL
和 SLOT
有一些问题,事实上当我点击它们时,视图并没有改变。
现在 RViz
有一个名为 getNumViews()
的特定函数,允许用户设置观看次数。就我而言,我有两个视图仅与我正在实施的两个 QPushButton
相关。
当我 运行 应用程序时,我收到以下错误 QObject::connect: No such slot MyViz::switchToView()
并认为所有正确设置 SIGNALS
和 SLOT
的段落都是正确的SIGNAL
和 SLOT
的 official documentation. Also for completeness I am using C++11
and from researching more I found that the old version,我正在使用的 official documentation. Also for completeness I am using C++11
and from researching more I found that the old version 应该仍然有效。
下面我是运行ning的SIGNAL
和SLOT
相关的代码:
myviz.h
public Q_SLOTS:
void switchToView(QString view);
private:
rviz::ViewManager *view_man;
myviz.cpp
MyViz::MyViz(QWidget *parent) : QWidget(parent)
{
// operation in the constructor
QPushButton *topViewBtn = new QPushButton("Top View");
QPushButton *sideViewBtn = new QPushButton("Side View");
connect(topViewBtn, SIGNAL(clicked()), this, SLOT(switchToView(QString("Top View"))));
connect(sideViewBtn, SIGNAL(clicked()), this, SLOT(switchToView(QString("Side View"))));
}
这里是我设置与两个 QPushButtons
void MyViz::switchToView(QString view)
{
view_man = manager->getViewManager();
for(int i = 0; i<view_man->getNumViews(); i++)
{
if(view_man->getViewAt(i)->getName() == view)
view_man->setCurrentFrom(view_man->getViewAt(i));
return;
std::cout<<"Did not find view named %s"<<std::endl;
}
}
感谢您为解决此问题指明了正确的方向。
您不能使用旧语法在连接函数中传递参数。参数的数量和类型也需要匹配,因此您只能将 clicked
连接到不带参数的函数。如果要使用旧语法,需要定义2个slot
public Q_SLOTS:
void switchToTopView();
void switchToSideView();
然后您可以通过以下方式连接:
connect(topViewBtn, SIGNAL(clicked()), this, SLOT(switchToTopView()));
connect(sideViewBtn, SIGNAL(clicked()), this, SLOT(switchToSideView()));
编辑:
新连接方法的正确语法是:
connect( topViewBtn, &QPushButton::clicked, this, &MyViz::switchToTopView);
这种方法的优点是你还可以绑定到lambdas,它间接让你在连接期间设置参数,所以你可以这样写
connect( topViewBtn, &QPushButton::clicked, [this](){
switchToView( QString("Top View") );
});