2009-08-17 13 views
5

Qual è il modo migliore per creare un pulsante play/pause in Qt? Dovrei creare un'azione e cambiarne l'icona quando si fa clic, o dovrei creare due azioni e in qualche modo nasconderne una quando si fa clic? Come posso usare un tasto di scelta rapida per attivare entrambe le azioni? (Pausa durante la riproduzione o riproduzione in pausa).Qt Azione riproduzione/pausa?

risposta

6

Keep It Simple. Utilizza lo stesso pulsante, ma quando gestisci il clic, cambia l'icona e scegli la logica di gestione (riproduzione o pausa) in base allo stato corrente (pausa durante la riproduzione o la riproduzione in pausa).

Per mantenere il codice libero, implementare due metodi distinti, uno per il gioco e uno per pausa e chiamarli dalla fessura del pulsante, depeding sullo stato.

+0

mi sarebbe effettivamente dovuto cambiare l'icona, il testo, la punta di stato, lo slot, e invece di chiamare il gioco() o mettere in pausa() slot direttamente, avrei dovuto chiamare una funzione nella stessa classe di aggiornare il pulsante e quindi propagare l'azione ... ha più senso avere due azioni che è possibile cambiare in modo da non dover gestire la modifica di tutte quelle proprietà. – mpen

+0

Per me, sembra più semplice avere una chiamata condizionale in un metodo a slot singolo, piuttosto che disconnettere e ricollegare uno slot ... Ma forse è una questione di prefferenza :) –

+0

Beh, non dovresti disc/riconnetti se avuto due azioni separate, no? Non avevo capito che intendevi uno slot per entrambe le azioni, però ... che * potrebbe * funzionare meglio. Devo pensare a questo in più. – mpen

2

penso che qualcosa di simile è più facile/più appropriato:

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); 

L'unica cosa che non mi piace è che le azioni stanno controllando lo stato di visibilità del pulsante ALTRE. Poiché non esiste la funzione setInvisible, non è stato possibile collegarla in modo che potessero nascondersi quando si fa clic.

Questo, e sembra per creare uno spazio visivo in cui il pulsante nascosto era (almeno su Ubuntu).

1

È possibile aggiungere sia il gioco e mettere in pausa le azioni per la barra degli strumenti e il menu della finestra principale e rendere l'azione di pausa invisibile. Quando è necessario cambiare questa azione, sarà sufficiente modificare la visibilità delle azioni e avrà effetto sul menu e sulla barra degli strumenti contemporaneamente. È comodo, il codice è compatto.

1

Non sono sicuro di cosa stiano facendo i pulsanti di riproduzione/pausa, ma sto creando un'app con Phonon per lo streaming audio e non sono riuscito a trovare un buon modo per ottenere lo stato corrente dell'oggetto multimediale.

Il più vicino possibile è quello di creare uno slot e collegarlo al segnale stateChanged() che emette MediaObject. Ho finito per fare questo:

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; 
    } 
} 

io non sono un fan di collegamento e ri-connessione, ma credo che questo è il modo Qt per farlo.