Qt播放/暂停操作?

5

在Qt中创建播放/暂停按钮的最佳方法是什么?我应该创建一个操作并在单击时更改其图标,还是应该创建两个操作,然后在单击时以某种方式隐藏其中一个?如何使用一个快捷键激活两个操作?(播放时暂停,或者暂停时播放)。

4个回答

6

保持简单。使用相同的按钮,但在处理点击时,根据当前状态更改图标并选择处理逻辑(播放或暂停)(播放时暂停或暂停时播放)。

为了保持代码清晰,实现两个单独的方法,一个用于播放,一个用于暂停,并从按钮的插槽中调用它们,具体取决于状态。


实际上,我需要更改图标、文本、状态提示、插槽,并且不能直接调用play()或pause()插槽,而是要调用同一类中的一个函数来更新按钮,然后传播该操作... 将有两个操作可以切换,这样就不必管理所有这些属性的更改,会更加合理。 - mpen
对我来说,在单个插槽方法中进行条件调用似乎更简单,而不是断开和重新连接插槽...但也许这只是个人偏好的问题 :) - Cătălin Pitiș
如果你有两个单独的操作,那么你就不必断开/重新连接了,对吧?不过我没意识到你是指一个插槽用于两个操作...这可能会更好一些。得再考虑一下。 - mpen

2
我认为这样做是最简单/最合适的方式:
playAct = new QAction(QIcon(":/icons/elementary/media-playback-start.png"), tr("&Run"), controlActGroup);
playAct->setShortcut(Qt::Key_Space);
playAct->setCheckable(true);
playAct->setStatusTip(tr("Run physics"));
connect(playAct, SIGNAL(triggered()), editorView, SLOT(runPhysics()));

pauseAct = new QAction(QIcon(":/icons/elementary/media-playback-pause.png"), tr("&Pause"), controlActGroup);
pauseAct->setShortcut(Qt::Key_Space);
pauseAct->setCheckable(true);
pauseAct->setStatusTip(tr("Pause physics"));
connect(pauseAct, SIGNAL(triggered()), editorView, SLOT(pausePhysics()));

connect(playAct, SIGNAL(toggled(bool)), pauseAct, SLOT(setVisible(bool)));
connect(pauseAct, SIGNAL(toggled(bool)), playAct, SLOT(setVisible(bool)));
pauseAct->setChecked(true);
pauseAct->setVisible(false);

我不喜欢的唯一一点是,动作控制了其他按钮的可见性状态。由于没有 setInvisible 函数,我无法将其连接起来,使它们在点击时能够隐藏自己。

另外,在 Ubuntu 上,它似乎会创建一个视觉间隙,这个间隙就是那个隐藏的按钮位置。


1

我不确定你的播放/暂停按钮在做什么,但我正在使用Phonon构建一个流音频的应用程序,我找不到一个好的方法来获取媒体对象的当前状态。

我能够找到的最接近的方法是创建一个插槽并将其连接到MediaObject发出的stateChanged()信号。我最终做了这个:

    MyMediaPlayer::MyMediaPlayer(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MyMediaPlayer)
    {
        ...

        connect(mediaObj, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
                this, SLOT(handleMediaState(Phonon::State,Phonon::State)));
    }

...

void MyMediaPlayer::handleMediaState(Phonon::State state, Phonon::State)
{
    switch (state)
    {
    case Phonon::PlayingState:
    case Phonon::LoadingState:
    case Phonon::BufferingState:
        //If we're playing, the button should pause
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-pause.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                mediaObj, SLOT(pause()));
        break;
    case Phonon::PausedState:
    case Phonon::StoppedState:
        //if we're paused, the button should play
        ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-play.svg"));
        connect(ui->playPauseButton, SIGNAL(clicked()),
                mediaObj, SLOT(play()));
    case Phonon::ErrorState:
        //additionally, if there's an error, do error handling.
        break;
    default:
        break;
    }
}

我不喜欢反复连接,但我猜这是Qt的方法。


1
您可以将播放和暂停操作都添加到工具栏和主窗口的菜单中,并使暂停操作不可见。当您需要切换这些操作时,您只需更改操作的可见性即可,它会同时对菜单和工具栏生效。这很方便,代码也很简洁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接