2009-08-17 46 views
5

Qtで再生/一時停止ボタンを作成する最善の方法は何ですか? 1つのアクションを作成してクリックするとそのアイコンを変更するか、2つのアクションを作成してクリックしたときに何かを隠すべきですか?ショートカットキーを使用して両方の操作を有効にするにはどうすればよいですか? (再生中は一時停止、一時停止中は再生)。Qt再生/一時停止の動作?

答えて

6

。同じボタンを使用しますが、クリックを処理するときはアイコンを変更し、現在のステータス(再生中は一時停止、一時停止中は再生)に基づいて処理ロジック(再生または一時停止)を選択します。

コードを明確にするには、再生と停止の2つの方法を実装し、ボタンのスロットから呼び出すことで状態を確認します。

+0

実際にアイコン、テキスト、ステータスヒント、スロットを変更し、play()やpause()スロットを直接呼び出すのではなく、同じクラスの関数を呼び出す必要がありますボタンを更新し、アクションを伝播します。切り替えることができる2つのアクションを持つ方が理にかなっているので、すべてのプロパティの変更を管理する必要はありません。 – mpen

+0

私には、単一のスロット方法で条件付き呼び出しをするのは、スロットを切断して再接続するよりも簡単です...しかし、多分それは先制の問題です:) –

+0

2つの別々の行動があった、いいえ?私はあなたが両方の行動のために1つのスロットを意味していたことを理解していませんでした。これについてもっと考えなければならない。 – 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が発することです。私が接続し、再接続のファンではないんだけど、私は、これはそれを行うためのQtの方法だと思い

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; 
    } 
} 

:私はこれをやってしまいました。

関連する問題