Предупреждающее сообщение «Нет соответствующего сигнала для» - PullRequest
0 голосов
/ 21 декабря 2018

Я использую qt-ros на основе qt4 для создания приложений.

Но есть проблема, что signal & slot не работает.

Библиотека vlc-qt IЯ использую обеспечивает функцию сигнала называется Play, как показано в ссылке ниже. vlc-qt

Я пытаюсь подключиться к методу QMetaObject :: connectSlotsByName, создав соответствующую функцию slot, но она не работает с предупреждением «Нет соответствующего сигнала для».

в mainWindow.h

public Q_SLOTS:
    void on_vListPlayer_played();

и в mainWindow.cpp

void MainWindow::on_vListPlayer_played()
{
    ROS_INFO("player started!------------------------------");
}
...
MainWindow::MainWindow(int argc, char** argv, QWidget *parent)
: QMainWindow(parent)
, qnode(argc,argv)
{
    ui.setupUi(this); // Calling this incidentally connects all ui's triggers to on_...() callbacks in this class.

    // UI Init
    QWidget* mainWidget = new QWidget(this);
    this->setCentralWidget(mainWidget);
    mainWidget->setStyleSheet("background-color: black;");
    QVBoxLayout* mainLayout = new QVBoxLayout;
    mainLayout->setMargin(0);
    mainLayout->setSpacing(0);
    mainWidget->setLayout(mainLayout);

    m_vVideoWidget = new VlcWidgetVideo;
    mainLayout->addWidget(m_vVideoWidget);

    m_vInstance = new VlcInstance(VlcCommon::args(), this);
    m_vPlayer = new VlcMediaPlayer(m_vInstance);
    m_vPlayer->setVideoWidget(m_vVideoWidget);

    vListPlayer = new VlcMediaListPlayer(m_vPlayer, m_vInstance);
    QObject::connect(vListPlayer, SIGNAL(played()), this, SLOT(on_vListPlayer_played()));

    m_vVideoWidget->setMediaPlayer(m_vPlayer);

    m_vList = new VlcMediaList(m_vInstance);
    openVideoes(m_DataPath);

    vListPlayer->setMediaList(m_vList);
    vListPlayer->setPlaybackMode(Vlc::PlaybackMode::Repeat);

    vListPlayer->mediaPlayer()->play();
...
}

в MediaListPlayer.h (vlc-qt lib)

class VLCQT_CORE_EXPORT VlcMediaListPlayer : public QObject
{
    Q_OBJECT
......
public Q_SLOTS:
    void itemAt(int index);
    void next();
    void play();
    void previous();
    void stop();

Q_SIGNALS:

    void played();
    void nextItemSet(VlcMedia *media);
    void nextItemSet(libvlc_media_t *media);
    void stopped();

1 Ответ

0 голосов
/ 22 декабря 2018

Вы используете Qt Designer, сгенерированный код (который вызывается ui.setupUi(this);) вызывает QMetaObject::connectSlotsByName(QObject *object).

В соответствии с Документация Qt это пытается соединить всеслоты с именем, соответствующим следующему шаблону: void on_<object name>_<signal name>(<signal parameters>);

Поскольку слот void on_vListPlayer_played() соответствует шаблону, делается попытка подключиться к нему.Но происходит сбой, потому что у вас нет объекта с именем vListPlayer.

В вашем случае я бы предложил вам переименовать слоты, чтобы они не соответствовали шаблону и не подключались автоматически.

...