Qtで再生/一時停止ボタンを作成する最良の方法は何ですか? 1 つのアクションを作成し、クリックしたときにそのアイコンを変更する必要がありますか、それとも 2 つのアクションを作成し、クリックしたときに 1 つを非表示にする必要がありますか? 1 つのショートカット キーを使用して両方のアクションを有効にするにはどうすればよいですか? (再生中に一時停止、または一時停止中に再生)。
4 に答える
シンプルにしてください。同じボタンを使用しますが、クリックを処理するときは、アイコンを変更し、現在のステータスに基づいて処理ロジック (再生または一時停止) を選択します (再生中は一時停止、一時停止中は再生)。
コードをわかりやすくするために、再生用と一時停止用の 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では)。
再生/一時停止ボタンが何をしているのかわかりませんが、オーディオをストリーミングするために 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 のやり方だと思います。
再生と一時停止の両方のアクションをツールバーとメイン ウィンドウのメニューに追加して、一時停止アクションを非表示にすることができます。このアクションを切り替える必要がある場合は、アクションの可視性を変更するだけでよく、メニューとツールバーに同時に反映されます。便利です、コードはコンパクトです。