Qt播放/暂停动作?

时间:2009-08-17 18:22:17

标签: qt action

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分: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);

我唯一不喜欢的是操作控制了OTHER按钮的可见性状态。由于没有setInvisible功能,我无法将其连接起来,以便在点击时可以隐藏自己。

那,它似乎创造了一个隐藏按钮的视觉差距(至少在Ubuntu上)。

答案 2 :(得分:1)

您可以将播放和暂停操作添加到工具栏和主窗口的菜单中,并使暂停操作不可见。当您需要切换此操作时,您只需要更改操作的可见性,它会同时影响菜单和工具栏。这很方便,代码很紧凑。

答案 3 :(得分:1)

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

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

    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的做法。