Qt5.QMediaPlayer bufferStatusChanged(int)信号不工作

Qt5. The signal of QMediaPlayer bufferStatusChanged(int) not works

本文关键字:信号 工作 int QMediaPlayer bufferStatusChanged Qt5      更新时间:2023-10-16

我的环境是Qt5 32bit Windows 7 64bit MSVC 2010 32bit

我的代码是一个简单的音乐播放器

这是主代码

slider = new QSlider(Qt::Horizontal);
slider->setRange(0, 100);
player->setMedia(QUrl::fromLocalFile("D://test.mp3"));
player->setVolume(50);
...
connect(player, SIGNAL(bufferStatusChanged(int)), slider, SLOT(setValue(int)));

当我运行这个播放器时,它可以播放音乐,但slider的值从未改变。

然后我加上这个:

connect(player, SIGNAL(bufferStatusChanged(int)), slider, SLOT(helloWorld(int)));
...
void player::helloWorld(int)
{
    qDebug() << "hello, world";
}

我再次运行它,发现字符串hello, world从未被打印。

没有打印任何东西。

为什么不修改slider的值?

------------------------- 完整代码 --------------------------

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    mainWidget = new QWidget();
    HLayout = new QHBoxLayout();
    VLayout = new QVBoxLayout();
    playButton = new QPushButton("Okay");
    exitButton = new QPushButton("Exit");
    slider = new QSlider(Qt::Horizontal);
    player = new QMediaPlayer();
    connect(playButton, SIGNAL(toggled(bool)), this, SLOT(playOrPause(bool)));
    connect(player, SIGNAL(bufferStatusChanged(int)), slider, SLOT(setValue(int)));
    connect(player, SIGNAL(bufferStatusChanged(int)), this, SLOT(test(int)));
    player->setMedia(QUrl::fromLocalFile("D://test.mp3"));
    player->play();
    player->setVolume(50);
    slider->setRange(0, 100);

    //UI
    exitButton->setAutoDefault(true);
    playButton->setAutoDefault(true);
    playButton->setCheckable(true);
    HLayout->addStretch();
    HLayout->addWidget(playButton);
    HLayout->addWidget(exitButton);
    VLayout->addWidget(slider);
    VLayout->addStretch();
    VLayout->addLayout(HLayout);
    mainWidget->setLayout(VLayout);
    setCentralWidget(mainWidget);
    setWindowIcon(QIcon(":/icons/icon.png"));
    setWindowTitle("YUCOAT");
    //connect(playButton, SIGNAL(toggled(bool)), this, SLOT(playOrPause(bool)));
    //connect(player, SIGNAL(bufferStatusChanged(int)), slider, SLOT(setValue(int)));
}
MainWindow::~MainWindow()
{
}
void MainWindow::playOrPause(bool s)
{
    if (s)
        player->play();
    else
        player->pause();
}
void MainWindow::test(int s)
{
    qDebug() << "hello, world!";
    qDebug() << s;
    qDebug() << player->mediaStatus();
}

根据文档:

当播放器对象正在缓冲时;此属性保存已填充的临时缓冲区的百分比。缓冲区将需要达到100%填充后才能恢复播放,此时MediaStatus将为BufferedMedia.

在加载媒体之后,您正在进行连接,因此可能缓冲区已经处于QMediaPlayer::BufferedMedia状态,因此信号不会发出。您可以通过在连接前打印媒体状态来检查:

qDebug() << player->mediaStatus();