Qt: QObject :: connect: такого слота нет - PullRequest
0 голосов
/ 15 июня 2019

Я создаю небольшой интерфейс, в котором я вложил в подкласс RViz, который является визуализатором из ROS . В соответствии с официальной документацией возможно повторное использование и повторная реализация некоторых функций, присутствующих в этом инструменте. Я пытаюсь создать два разных QPushButton, которые будут изменять представление реализованного рендерера. У меня есть некоторые проблемы с SIGNAL ans SLOT для моих двух кнопок, фактически, когда я нажимаю их, вид не меняется. Теперь RViz имеет специальную функцию под названием getNumViews(), которая позволяет пользователю устанавливать количество просмотров. В моем случае у меня есть два представления, относящиеся только к двум QPushButton, которые я реализую.

sig-slot

Когда я запускаю прикладную программу, я получаю следующую ошибку QObject::connect: No such slot MyViz::switchToView() и думаю, что все отрывки для правильной установки SIGNALS и SLOT были правильными в соответствии с официальной документацией . Также, для полноты, я использую C++11, и, изучив больше, я обнаружил, что старая версия из SIGNAL и SLOT, которую я использую, должна оставаться в силе.

Ниже кода, относящегося к 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"))));

}

здесь я установил 2 возможности просмотра, связанные с двумя 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;
    }
}

Спасибо, что указали в правильном направлении для решения этой проблемы.

1 Ответ

1 голос
/ 15 июня 2019

Вы не можете передавать аргументы в функцию соединения, используя старый синтаксис. Кроме того, количество и тип аргументов должны совпадать, поэтому вы можете подключать clicked только к функциям без аргументов. Если вы хотите использовать старый синтаксис, вам нужно определить 2 слота

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

Преимущество этого метода в том, что вы также можете привязывать к лямбдам, что косвенно позволяет вам устанавливать параметры во время соединения, так что вы можете написать

connect( topViewBtn, &QPushButton::clicked, [this](){
    switchToView( QString("Top View") );
});
...