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
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.
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).
È 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.
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.
- 1. Azione per delegare: nuova azione o azione di lancio?
- 2. Azione pulsante separata e azione successiva
- 3. Qt Quick vs. Qt Widget
- 4. QT Come incorporare un'applicazione nel widget QT
- 5. Gestione della memoria Qt per oggetti Qt
- 6. Qt: classi Qt vs. standard C++
- 7. Impossibile eseguire il cast Provider azione per Condividere Provider azione
- 8. UIButton con azione di mantenimento e azione di rilascio
- 9. Azione reindirizzamento in struts.xml
- 10. WIX C++ personalizzato Azione
- 11. Azione mancante Eclipse Imposta
- 12. azione personalizzata in SonataAdminBundle
- 13. azione laravel non definito
- 14. JSF2.0 Azione componente compositoListener
- 15. Sequenza azione WiX
- 16. Azione condizionale in SSRS
- 17. Definisce in azione script
- 18. Ottenere obiettivo di Azione
- 19. Scheda di azione Android
- 20. C# Azione in Foreach
- 21. Azione JSF da onChange
- 22. CancellationToken UNREGISTER azione
- 23. Chiamata ricorsiva - Azione lambda
- 24. Android azione programma
- 25. Disabilita azione ScrollView
- 26. Funzione JavaScript denominata "azione"
- 27. azione form con javascript
- 28. fortemente tipizzato azione url
- 29. Codice codice UIButton azione
- 30. Azione SOAP WSDL
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
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 :) –
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