2009-08-17 19 views
5

¿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

6

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.

+0

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

+0

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 :) –

+0

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

2

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

1

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.

1

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.

Cuestiones relacionadas