Каков наилучший способ создания кнопки воспроизведения/паузы в Qt? Должен ли я создать одно действие и изменить его значок при нажатии, или мне нужно создать два действия, а затем как-то скрыть его при нажатии? Как использовать одну комбинацию клавиш для активации обоих действий? (Пауза при воспроизведении или воспроизведение при паузе).Qt Играть/Пауза Действие?
ответ
Держите его простым. Используйте ту же кнопку, но при обработке щелчка измените значок и выберите логику обработки (воспроизведение или пауза) в зависимости от текущего состояния (пауза при воспроизведении или воспроизведении при паузе).
Для того, чтобы код был чистым, реализуйте два отдельных метода: один для воспроизведения и один для паузы и вызывать их из слота кнопки, основываясь на статусе.
Я думаю, что что-то, как это самый простой/наиболее подходящий:
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).
Вы можете добавить как действие воспроизведения, так и паузу на панель инструментов и в главное меню и сделать действие паузы невидимым. Когда вам нужно переключить эти действия, вам нужно будет только изменить видимость действий, и это повлияет на меню и на панели инструментов одновременно. Это удобно, код компактный.
Я не уверен, что делают ваши кнопки воспроизведения/паузы, но я создаю приложение с 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 способ сделать это.
- 1. Qt AutoConnect действие
- 2. Qt: Действие после завершения QMediaPlayer
- 3. Qt ShortcutOverride действие по умолчанию
- 4. Python QT Действие NextButton как подтверждение
- 5. Qt получить действие щелкнуто из подменю
- 6. Qt Асинхронное действие Во время aboutToQuit
- 7. Qt добавляет «действие» к динамически добавленному QWidget
- 8. действие Qt 5.7 QFileDialog не работает
- 9. Как подключить Qt-действие с помощью функции
- 10. Как вставить действие в меню с Qt Designer?
- 11. как установить значок в главном окне и действие с QT
- 12. Qt C++, действие при нажатии QPushButton производится динамически
- 13. Как установить слот, принимающий каждое действие виджета в Qt
- 14. Как связать действие с изменением значения в C++/Qt
- 15. Qt - открыть диалоговое окно, когда действие запускается несколько раз
- 16. Действие для делегирования: новое действие или действие?
- 17. Qt Designer - Qt 4.8.1
- 18. Qt mousemoveevent + Qt :: LeftButton
- 19. Qt: убить текущий процесс?
- 20. Контроль доступа в Qt
- 21. qt qtoolbutton icon blurry
- 22. Qt
- 23. Qt зависимости между проектами
- 24. QT widgets vs QT GUI
- 25. Qt Quick vs. Qt Widget
- 26. QT: Когда использовать QT :: keyRelease
- 27. Qt, qt core включение необходимо?
- 28. QT Mobility - Nokia QT SDK
- 29. Показать форму в Qt
- 30. QT событие двойного щелчка клавиатуры
Мне действительно нужно будет изменить значок, текст, подсказку состояния, слот, и вместо того, чтобы напрямую обращаться к слотам play() или pause(), мне пришлось бы вызвать функцию в том же классе, чтобы обновить кнопку, а затем развернуть действие ... имеет смысл иметь два действия, которые вы можете переключить, поэтому вам не нужно управлять изменением всех этих свойств. – mpen
Для меня проще иметь условный вызов в одном слоте, чем отключать и снова подключать слот ... Но, возможно, это вопрос преференции :) –
Ну, вам не придется записывать/снова подключаться, если вы было два отдельных действия, нет? Я не понимал, что вы имели в виду один слот для обоих действий, хотя ... что * может * работать лучше. Подумайте об этом больше. – mpen