c++ - Qt5。 QMediaPlayer bufferStatusChanged(int) 的信号不起作用

标签 c++ qt media-player

我的环境是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();
}

最佳答案

根据documentation :

When the player object is buffering; this property holds the percentage of the temporary buffer that is filled. The buffer will need to reach 100% filled before playback can resume, at which time the MediaStatus will be BufferedMedia.

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

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

关于c++ - Qt5。 QMediaPlayer bufferStatusChanged(int) 的信号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318250/

相关文章:

c++ - Boost.Fusion 适配结构中默认值的 Boost.Spirit.Qi 语法

c++ - 在 3D 中 boost 两条线段的交集

c++ - 如何防止打开文件两次?

c++ - 为什么在隐式共享容器上使用迭代器时必须先复制?

Android 停止计数器并销毁媒体播放器

c++ - Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建)

c++ - 语法 "ContextRegistrar_##ContextType"的含义

c++ - LNK2001 静态属性和方法错误(Qt、C++)

android - 在 MediaPlayer 中显示内部字幕

azure - 设置 Azure Media Player 的开始时间