2009-08-17 2 views
5

Каков наилучший способ создания кнопки воспроизведения/паузы в Qt? Должен ли я создать одно действие и изменить его значок при нажатии, или мне нужно создать два действия, а затем как-то скрыть его при нажатии? Как использовать одну комбинацию клавиш для активации обоих действий? (Пауза при воспроизведении или воспроизведение при паузе).Qt Играть/Пауза Действие?

ответ

6

Держите его простым. Используйте ту же кнопку, но при обработке щелчка измените значок и выберите логику обработки (воспроизведение или пауза) в зависимости от текущего состояния (пауза при воспроизведении или воспроизведении при паузе).

Для того, чтобы код был чистым, реализуйте два отдельных метода: один для воспроизведения и один для паузы и вызывать их из слота кнопки, основываясь на статусе.

+0

Мне действительно нужно будет изменить значок, текст, подсказку состояния, слот, и вместо того, чтобы напрямую обращаться к слотам play() или pause(), мне пришлось бы вызвать функцию в том же классе, чтобы обновить кнопку, а затем развернуть действие ... имеет смысл иметь два действия, которые вы можете переключить, поэтому вам не нужно управлять изменением всех этих свойств. – mpen

+0

Для меня проще иметь условный вызов в одном слоте, чем отключать и снова подключать слот ... Но, возможно, это вопрос преференции :) –

+0

Ну, вам не придется записывать/снова подключаться, если вы было два отдельных действия, нет? Я не понимал, что вы имели в виду один слот для обоих действий, хотя ... что * может * работать лучше. Подумайте об этом больше. – mpen

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 способ сделать это.

Смежные вопросы