Qt: QObject::connect: 没有这样的插槽

Qt: QObject::connect: No such slot

我正在构建一个小界面,其中我对 RViz 进行了子类化,它是 ROS. According to the official documentation 的可视化工具,可以重新使用和重新实现此工具中存在的一些功能。我想做的是创建两个不同的 QPushButton 来改变渲染器的视图。 我的两个按钮的 SIGNALSLOT 有一些问题,事实上当我点击它们时,视图并没有改变。 现在 RViz 有一个名为 getNumViews() 的特定函数,允许用户设置观看次数。就我而言,我有两个视图仅与我正在实施的两个 QPushButton 相关。

当我 运行 应用程序时,我收到以下错误 QObject::connect: No such slot MyViz::switchToView() 并认为所有正确设置 SIGNALSSLOT 的段落都是正确的SIGNALSLOTofficial 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的SIGNALSLOT相关的代码:

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") );
});