在 Qt 中创建播放/暂停按钮的最佳方法是什么?我应该创建一个动作并在单击时更改它的图标,还是应该创建两个动作然后在单击时以某种方式隐藏一个?如何使用一个快捷键来激活这两个操作?(播放时暂停,或暂停时播放)。
问问题
6530 次
4 回答
6
保持简单。使用相同的按钮,但在处理点击时,更改图标并根据当前状态(播放时暂停或暂停时播放)选择处理逻辑(播放或暂停)。
为了保持代码清晰,实现两个单独的方法,一个用于播放,一个用于暂停,并从按钮的插槽中调用它们,具体取决于状态。
于 2009-08-17T18:27:51.130 回答
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);
我唯一不喜欢的是这些操作正在控制 OTHER 按钮的可见性状态。由于没有setInvisible
功能,我无法将其连接起来,以便他们在单击时可以隐藏自己。
那,它似乎在隐藏按钮所在的位置(至少在 Ubuntu 上)产生了视觉差距。
于 2009-08-17T18:51:08.167 回答
1
您可以将播放和暂停操作添加到工具栏和主窗口的菜单中,并使暂停操作不可见。当您需要切换此操作时,您只需更改操作的可见性,它会同时影响菜单和工具栏。很方便,代码很紧凑。
于 2012-03-31T13:14:29.253 回答
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 的方式。
于 2012-05-01T05:03:25.223 回答