【问题标题】:A warning message “No matching signal for”警告消息“没有匹配的信号”
【发布时间】:2019-05-21 16:14:03
【问题描述】:

我正在使用基于qt4qt-ros 来构建应用程序。

但是有一个问题是signal & slot不起作用。

我正在使用的 vlc-qt 库提供了一个名为played 的信号函数,如下面的链接所示。 vlc-qt

我尝试通过创建适当的slot 函数来连接到QMetaObject :: connectSlotsByName 方法,但它不能与警告“没有匹配的信号”一起工作。

在 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 库)

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

【问题讨论】:

  • 完整的警告信息是什么?
  • 你更新 moc 文件了吗?如果再次运行 qmake,然后(重新)构建会发生什么?
  • @FrederikDeRuyck 我不知道如何独立运行 qmake。我只使用 qt-ros / qt_build。 "github.com/stonier/qt_ros/tree/indigo/qt_build"
  • @vahancho QMetaObject::connectSlotsByName: on_vListPlayer_played() 没有匹配信号

标签: c++ qt qt4 ros vlc-qt


【解决方案1】:

您正在使用 Qt Designer,生成的代码(由ui.setupUi(this); 调用)调用QMetaObject::connectSlotsByName(QObject *object)

根据Qt documentation,这会尝试连接名称与以下模式匹配的所有插槽:void on_<object name>_<signal name>(<signal parameters>);

当插槽void on_vListPlayer_played() 与模式匹配时,会尝试连接它。但是失败是因为你没有任何对象namedvListPlayer

在您的情况下,我建议您重命名您的插槽,以便它们与模式不匹配并且不会自动连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多