2009-08-17 172 views
5

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

回答

6

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

为了保持代码清晰,实现两个独立的方法,一个用于播放,一个用于暂停,并根据按钮的状态调用它们。

+0

我实际上必须更改图标,文本,状态提示,插槽,而不是直接调用play()或pause()插槽,我必须调用同一个类中的函数来更新按钮,然后传播动作...更有意义的是,您可以切换两个动作,因此您不必管理更改所有这些属性。 – mpen 2009-08-17 18:49:43

+0

对我来说,在一个插槽方法中进行有条件的调用看起来比断开连接并重新连接插槽更简单......但是也许这是一个预先考虑的问题:) – 2009-08-17 19:09:07

+0

那么如果你需要的话,你不需要光盘/重新连接有两个单独的行动,不是?我没有意识到你的意思是一个插槽的两个行动虽然......这可能会更好地工作。必须更多地考虑这个问题。 – mpen 2009-08-17 20:58:29

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

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

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的方式来做到这一点。