2017-09-19 10 views
0

QT에서 간단한 비디오 플레이어를 만들고 있습니다.성능을 손상시키지 않고 Qslider에서 직접 점프하는 방법

멀티미디어 플레이어에 연결 (그는 영화를 앞뒤로 실행하는 책임이 있습니다)하고 연결된 슬라이드를 만들었습니다. 슬라이드를 드래그하여 슬라이드의 아무 곳이나 클릭하여 이동할 수 있습니다. 커서. 이제 때

connect(player, &QMediaPlayer::durationChanged,pos_slider, &MySlider::setMaximum); 
connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue); 

connect(pos_slider, &MySlider::sliderMoved, player, &QMediaPlayer::setPosition); 
connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition); 

내 문제는 : 이것은 플레이어에게 슬라이드를 연결하는 방식입니다

class MySlider : public QSlider 
{ 

protected: 
    void mousePressEvent(QMouseEvent *event) 
    { 
     if (event->button() == Qt::LeftButton) 
     { 
      if (orientation() == Qt::Horizontal) 
      { 
       setValue(minimum() + (maximum() - minimum()) * (static_cast<float>(event->x())/static_cast<float>(width()))); 
      } 
      event->accept(); 
     } 
     QSlider::mousePressEvent(event); 
    } 

}; 

다음과 같이

나는 내 자신의 방법을 추가하여이 작업을 수행하려 영화가 재생 중일 때 지연이 있습니다 (몇 초마다 영화가 멈춤). 내 의견으로는,이 추가 때문에 실제로 듣고 보내는 이벤트를 추가 했으므로 실제로 플레이어에게 많은 압박을 가하고 있습니다.

플레이어의 성능에 영향을주지 않는 방식으로 슬라이더를 움직이게하려면 어떻게해야합니까? 요코에게

당신을 감사

추신을 (또는 최소한으로 성능 저하를 줄일 수)

문제의 중심은 나 미디어 플레이어에서 connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::setValue);을 사용하고 또한 connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition);이 중복 성능 문제를 일으키는 것입니다,하지만 난 당신이 지적 내가이 중복

+0

마우스 클릭 이벤트가 아마 그것과는 상관이 없지만,'positionChanged' 이벤트가 자주 방출 될 수있다, 인수는 밀리 초 단위의 위치이므로 여전히 핸들러만으로도 몇 초 동안 멈출 수는 없을 것입니다. 처리기가 얼마나 자주 호출되는지 알아 내려고 할 수 있습니까? 또한이 처리기를 추가 할 때 CPU 사용량이 증가 했습니까? –

+0

두 핸들러는 수렴이 느린 루프에서 서로를 호출 할 수도 있습니다. ['blockSignals'] (http://doc.qt.io/qt-5/qobject.html#blockSignals)를 사용하여 일시적으로 이벤트를 방출하지 못하게 할 수 있습니다. –

+0

@KarstenKoop이 루프가 문제인지는 모르지만 어떻게해야합니까? ? 비디오 위치를 기반으로 위치를 업데이트해야하며 스크롤러 위치를 기반으로 자신의 위치를 ​​업데이트 할 비디오가 필요합니다.이 루프를 사용하면 수락 옵션을 찾지 못했습니다. – YOKO

답변

0

제거 할 수있는 방법 아무 생각이 없다는 것입니다 너 자신은 문제가 (아마) QMediaPlayer::positionMySlider::value 사이의 공명 때문입니다. 그래서

, 당신은이 QMediaPlayer::positionMySlider::value이 프로그램 업데이트 될 때, 즉 다음과 같은 연결 사용하지 않는 변경하는 것을 방지한다 : 해결 방법 1

대신

connect(pos_slider, &MySlider::valueChanged ,player, &QMediaPlayer::setPosition); 

을, 당신은 sliderReleased를 사용해야하고 sliderMovedQMediaPlayer::position을 업데이트하고 QMediaPlayer::setPosition을 수동으로 mousePressEvent 내부로 호출하도록 신호를 보내십시오 (해당하는 경우).

해결책 2 : 발광 신호를 차단하는 경우 변경된 QMediaPlayer::position (덕분 너무 스텐 쿠프)

슬라이더 값을 갱신 자신의 슬롯을 만든다. 이 경우 다음과 같은 연결이 필요하지 않습니다

connect(player, &QMediaPlayer::positionChanged,pos_slider, &MySlider::updateValueFromMediaPlayer); 

void MySlider::updateValueFromMediaPlayer(int pos) 
{ 
    blockSignals(true); 
    setValue(pos); 
    blockSignals(false); 
} 

참고 :

connect(pos_slider, &MySlider::sliderMoved, player, &QMediaPlayer::setPosition); 
+1

'setValue();'를'setValue (pos);': P – eyllanesc