【问题标题】:How to set a sound in Qt如何在 Qt 中设置声音
【发布时间】:2017-04-21 12:17:34
【问题描述】:

second 更改时,我正在尝试播放声音。

在我的stopwatch 中有milliseconds,它在miliseconds' 变化下播放,而不是seconds'。我应该为*seconds* 创建一个条件

但是不能正确地做到这一点,你能建议这种情况吗?

这是我的方法(保留QMediaPlayer对象 for milliseconds ):

我的构造函数和插槽:

StopMainWindow::StopMainWindow(QWidget *parent) :
    QMainWindow(parent),

      mRunning(false)
    , mStartTime()
    , mTotalTime(0)
{


    //ON THE TOP THERE ARE QPUSHBUTTONS AND QLABELS OBJECTS


    connect(pushButton_Start, SIGNAL(clicked()), SLOT(start()));
    connect(pushButton_go_on, SIGNAL(clicked()), SLOT(pause()));
    connect(pushButton_Stop, SIGNAL(clicked()), SLOT(stop()));
    connect(pushButton_Close, SIGNAL(clicked()), SLOT(close()));
    connect(pushButton_Back,SIGNAL(clicked()),SLOT(back()));
///////////////////////////////////////////////////////////////////////////////
    setCentralWidget(centralWidget);
///////////////////////////////////////////////////////////////////////////////////////////////
    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(false);
    pushButton_Stop->setEnabled(false);
    startTimer(0);
}

StopMainWindow::~StopMainWindow()
{}
void StopMainWindow::start(void)
{
    pushButton_Start->setEnabled(false);
    pushButton_go_on->setEnabled(true);
    pushButton_Stop->setEnabled(true);
    mStartTime = QDateTime::currentDateTime();
    mRunning = true;
    QMediaPlayer *music=new QMediaPlayer();
    music->setMedia(QUrl("qrc:/sounds/tik.mp3"));
    music->play();
}



void StopMainWindow::stop(void)
{
    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(true);
    pushButton_Stop->setEnabled(false);
    mTotalTime = 0;
    mRunning = false;
}
void StopMainWindow::pause(void)
{
    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(false);
    pushButton_Stop->setEnabled(true);
    timerEvent(new QTimerEvent(0));
    mTotalTime += mSessionTime;
    mRunning = false;
}
void StopMainWindow::timerEvent(QTimerEvent *)
{

    if(mRunning)
    {

     mSessionTime = mStartTime.msecsTo(QDateTime::currentDateTime());
        qint64 time = mTotalTime + mSessionTime;
        time *= 111;

        unsigned int h = time / 1000 / 60 / 60;
        unsigned int m = (time / 1000 / 60) - (h * 60);
        unsigned int s = (time / 1000) - ((m + (h * 60))* 60);
        unsigned int ms = time - (s + ((m + (h * 60))* 60)) * 1000;

        const QString diff = QString("%1:%2:%3,%4").arg(h,  2, 10, QChar('0')).arg(m,  2, 10, QChar('0')).arg(s,  2, 10, QChar('0')).arg(ms, 3, 10, QChar('0'));
        mLabel->setText(diff);
    }

}

【问题讨论】:

  • timerEvent 期间是什么?
  • @eyllanesc 它是用我的按钮 countinue 为 cennection 创建的。这是我的 SLOT,其中使用了 timerEventvoid StopMainWindow::pause(void) { **timerEvent**(new QTimerEvent(0)); mTotalTime += mSessionTime; mRunning = false; }
  • 你可以把你的完整代码,因为它看起来不正确。
  • @eyllanesc 我已经编辑了,请检查一下。
  • @eyllanesc 在我看来,我不应该在timerEvent 中玩music。我想,我必须使用QDateTime::currentDateTime(); 函数。但我无法理解,我应该如何将它与音乐联系起来..

标签: c++ qt


【解决方案1】:

我建议只初始化一次 QMediaPlayer 并通过 QMediaPlaylist 添加声音,方法是放置 QMediaPlaylist::Loop 以连续运行,因为声音是精确的秒,不需要使用计时器。由于您希望QLabel 每毫秒更改一次,我们使用startTimer(1)complete example.

StopMainWindow::StopMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::StopMainWindow)
{
    [...]

    connect(pushButton_Start, &QPushButton::clicked, this, &StopMainWindow::start);
    connect(pushButton_go_on, &QPushButton::clicked, this, &StopMainWindow::pause);
    connect(pushButton_Stop, &QPushButton::clicked, this, &StopMainWindow::stop);

    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(false);
    pushButton_Stop->setEnabled(false);

    music=new QMediaPlayer(this,  QMediaPlayer::StreamPlayback);
    QMediaPlaylist *playlist = new QMediaPlaylist;
    playlist->addMedia(QUrl("qrc:/sounds/tik.mp3"));
    playlist->setPlaybackMode(QMediaPlaylist::Loop);

    music->setPlaylist(playlist);
    music->setVolume(100);

    mRunning = false;
}



void StopMainWindow::start()
{
    pushButton_Start->setEnabled(false);
    pushButton_go_on->setEnabled(true);
    pushButton_Stop->setEnabled(true);
    music->play();

    mRunning = true;

    mStartTime = QDateTime::currentDateTime();

    startTimer(1);
}

void StopMainWindow::pause()
{
    music->pause();
    mRunning = false;
    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(false);
    pushButton_Stop->setEnabled(true);
    mTotalTime += mSessionTime;
}

void StopMainWindow::stop()
{
    pushButton_Start->setEnabled(true);
    pushButton_go_on->setEnabled(true);
    pushButton_Stop->setEnabled(false);

    music->stop();
    mRunning = false;
}

void StopMainWindow::timerEvent(QTimerEvent *event)
{
    Q_UNUSED(event)
    if(mRunning){
        mSessionTime = mStartTime.msecsTo(QDateTime::currentDateTime());
        qint64 time = mTotalTime + mSessionTime;
        time *= 111;

        unsigned int h = time / 1000 / 60 / 60;
        unsigned int m = (time / 1000 / 60) - (h * 60);
        unsigned int s = (time / 1000) - ((m + (h * 60))* 60);
        unsigned int ms = time - (s + ((m + (h * 60))* 60)) * 1000;

        const QString diff = QString("%1:%2:%3,%4").arg(h,  2, 10, QChar('0')).arg(m,  2, 10, QChar('0')).arg(s,  2, 10, QChar('0')).arg(ms, 3, 10, QChar('0'));
        mLabel->setText(diff);
    }
}

【讨论】:

  • 非常感谢您的帮助,它确实有效,我需要!
猜你喜欢
  • 2023-04-03
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多