2009-08-17 5 views
5

Qt에서 재생/일시 정지 버튼을 만드는 가장 좋은 방법은 무엇입니까? 클릭하면 하나의 작업을 만들고 아이콘을 변경해야합니까? 아니면 두 번의 작업을 만들어야하고 클릭 할 때 어떻게 든 숨길 수 있습니까? 하나의 바로 가기 키를 사용하여 두 작업을 모두 활성화하려면 어떻게합니까? (재생할 때 일시 중지하거나 일시 중지시 재생).Qt 재생/일시 정지 동작?

답변

6

간단하게 유지하십시오. 동일한 버튼을 사용하지만 클릭을 처리 할 때 아이콘을 변경하고 현재 상태 (일시 중지시 재생 또는 일시 중지시 일시 중지)를 기반으로 처리 논리 (재생 또는 일시 중지)를 선택합니다.

코드를 명확하게 유지하려면 재생 및 일시 중지의 두 가지 메소드를 구현하고 버튼의 슬롯에서 호출하여 상태를 확인하십시오.

+0

실제로 아이콘, 텍스트, 상태 팁, 슬롯을 변경해야하며 play() 또는 pause() 슬롯을 직접 호출하는 대신 동일한 클래스의 함수를 호출해야합니다. 버튼을 업데이트 한 다음 액션을 전파하십시오 ... 전환 할 수있는 두 가지 액션이 더 적합하므로 모든 속성을 변경하지 않아도됩니다. – mpen

+0

나를 위해 슬롯 연결을 끊고 다시 연결하는 것보다 단일 슬롯 방법으로 조건부 호출을하는 것이 더 간단 해 보입니다.하지만 어쩌면 그것은 우선적 인 문제 일 것입니다 :) –

+0

그럼 디스크를 넣을 필요가 없습니다. 두 가지 별도의 행동이 있었습니까? 나는 당신이 두 가지 행동 모두를위한 하나의 슬롯을 의미한다는 것을 깨닫지 못했다. 이것에 대해 더 생각해야합니다. – 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 함수가 없기 때문에 클릭 할 때 숨길 수 있도록 함수를 연결하지 못했습니다.

그건, 그리고 그것은 숨겨진 버튼이 (적어도 우분투에서) 시각적 인 차이를 만드는 것처럼 보입니다.

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는 방법입니다 같아요.