¿Cuál es la mejor manera de crear un botón Reproducir/Pausa en Qt? ¿Debo crear una acción y cambiar su ícono cuando hago clic, o debo crear dos acciones y luego ocultar de alguna manera una cuando hago clic? ¿Cómo uso una tecla de método abreviado para activar ambas acciones? (Pausa al reproducir o reproducir cuando está en pausa).Qt Reproducir/Pausa Acción?
Respuesta
Hazlo simple. Use el mismo botón, pero cuando maneje el clic, cambie el ícono y elija la lógica de manejo (reproducción o pausa) según el estado actual (pausa al reproducir o reproducir cuando está en pausa).
Para mantener el código libre, implemente dos métodos separados, uno para reproducir y otro para pausa y llámelos desde la ranura del botón, dependiendo del estado.
creo que algo como esto es más fácil/más apropiado:
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);
La única cosa que no me gusta es que las acciones son el control de estado de visibilidad OTRAS del botón. Como no existe la función setInvisible
, no pude conectarla para que pudieran ocultarse al hacer clic.
Eso, y parece crear un espacio visual donde estaba el botón oculto (al menos en Ubuntu).
Puede agregar acciones de reproducción y pausa a la barra de herramientas y al menú de la ventana principal y hacer que la acción de pausa sea invisible. Cuando necesite cambiar estas acciones, solo tendrá que cambiar la visibilidad de las acciones y tendrá efecto en el menú y en la barra de herramientas simultáneamente. Es conveniente, el código es compacto.
No estoy seguro de qué están haciendo los botones Reproducir/Pausa, pero estoy creando una aplicación con Phonon para transmitir audio y no pude encontrar una buena forma de obtener el estado actual del objeto multimedia.
Lo más que podría conseguir es crear una ranura y conectarla a la señal stateChanged()
que emite MediaObject
. Terminé haciendo esto:
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;
}
}
No soy un fan de conexión y reconexión, pero creo que esta es la forma de Qt para hacerlo.
- 1. Qt Quick vs. Qt Widget
- 2. Cómo conectar el menú, haga clic en acción en Qt Creator?
- 3. Qt: ¿Botón desplegable?
- 4. Qt - mezclando Qt y std :: C++ tipos
- 5. Qt object/class to Qt ui file
- 6. Qt: clases Qt frente a estándar C++
- 7. Comandos de acción vs clases de acción?
- 8. puntales de entrada acción mapeo acción atribuyen
- 9. Qt - setupUi()
- 10. emitir la señal Qt desde el subproceso Qt no Qt o fuera Qt evento principal de bucle con en 4.5
- 11. qt archivo no se puede abrir la entrada 'c: \ Qt \ qt \ lib \ qtmaind.lib'
- 12. QT/QT-Designer Pregunta: widget de cambio de tamaño automático
- 13. Qt Creator no puede encontrar ninguna versión de Qt válida
- 14. Creación de menú contextual con Qt Designer (Qt Creator IDE)
- 15. Documentación para comentarios sobre la documentación de Qt? Qt + Doxygen?
- 16. ¿Dónde encontrar versiones anteriores de QT (por ejemplo, QT 4.6)?
- 17. ¿Qué .gitignore debería usar con proyectos de QT? (Qt Creator)
- 18. ¿Puedo usar Qt sin qmake o Qt Creator?
- 19. Cargando complementos Qt al enlazar a Qt estáticamente?
- 20. Uso de los iconos estándar de Qt desde Qt Creator
- 21. Mejor práctica de QT/PyQT para usar QT Designer
- 22. Acción <T> o Acción <in T>?
- 23. Rails3 button_to está llamando acción POST, intentando llamar acción PUT
- 24. ¿Acción de aserción redirigida para corregir la acción/ruta?
- 25. Rails rutas acción de índice directo para mostrar acción
- 26. ASP.NET MVC Pass objeto de acción personalizada Filtro de Acción
- 27. Acción de botón separada y acción de transición
- 28. Uso de SQLite con Qt
- 29. Serialización con Qt
- 30. Obteniendo MouseMoveEvents en Qt
Tendría que cambiar el ícono, el texto, la punta de estado, la ranura, y en lugar de llamar a las ranuras play() o pause() directamente, tendría que llamar a una función de la misma clase para actualice el botón, y luego propague la acción ... tiene más sentido tener dos acciones que puede cambiar para que no tenga que administrar el cambio de todas esas propiedades. – mpen
Para mí, parece más simple tener una llamada condicional en un solo método de ranura, que desconectar y volver a conectar una ranura ... Pero tal vez sea una cuestión de preferencia :) –
Bueno, no tendrías que hacer un disco/reconexión si tenía dos acciones separadas, ¿no? Sin embargo, no me di cuenta de que quería decir una ranura para ambas acciones ... que * podría * funcionar mejor. Tengo que pensar en esto más. – mpen