2009-08-17 230 views
5

在Qt中創建播放/暫停按鈕的最佳方式是什麼?我應該創建一個動作並在點擊時更改它的圖標,或者我應該創建兩個動作,然後以某種方式隱藏一個單擊時?如何使用一個快捷鍵來激活這兩個操作? (播放時暫停,暫停時播放)。Qt播放/暫停動作?

回答

6

保持簡單。使用相同的按鈕,但在處理點擊時,更改圖標並根據當前狀態選擇處理邏輯(播放或暫停)(暫停播放或暫停時暫停)。

爲了保持代碼清晰,實現兩個獨立的方法,一個用於播放,一個用於暫停,並根據按鈕的狀態調用它們。

+0

我實際上必須更改圖標,文本,狀態提示,插槽,而不是直接調用play()或pause()插槽,我必須調用同一個類中的函數來更新按鈕,然後傳播動作...更有意義的是,您可以切換兩個動作,因此您不必管理更改所有這些屬性。 – mpen 2009-08-17 18:49:43

+0

對我來說,在一個插槽方法中進行有條件的調用看起來比斷開連接並重新連接插槽更簡單......但是也許這是一個預先考慮的問題:) – 2009-08-17 19:09:07

+0

那麼如果你需要的話,你不需要光盤/重新連接有兩個單獨的行動,不是?我沒有意識到你的意思是一個插槽的兩個行動雖然......這可能會更好地工作。必須更多地考慮這個問題。 – mpen 2009-08-17 20:58:29

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的方式來做到這一點。