2012-03-06 2 views
0

QPainterPath의 드로잉 알고리즘을 어떻게 커스터마이징 할 수 있습니까?QWidget에서 QPaintPath 드로잉 알고리즘 사용자 정의

시각적 요소 만 그림으로써 앱 속도를 높이고 싶습니다.

나는 QPainterPath에서 실시간 그래프 그리기 오전이 일을하고 싶습니다 : QPainterPath의 왼쪽 눈에 보이는 요소의

  1. 이진 검색을.
  2. QPainterPath의 맨 오른쪽 보이는 요소의 이진 검색.
  3. 보이는 요소 만 그립니다.

내 QWidget의 QPaintEngine을 QWidget::paintEngine()을 통해 사용자 지정해야한다고 생각합니다.

그러나 QPaintEngine::drawPath(...) 기본 구현 does nothing.

맞습니까?

UPDATE : respounce, Koying에 대한

감사합니다.

이 난 그냥이 방법을 tryed했습니다

int minIndex = BinarySearchForMatchOrGreat(path, beginOffset); 
int maxIndex = BinarySearchForMatchOrGreat(path, endOffset); 
QPainterPath newPath; 
for (int i = minIndex; i < maxIndex; i++) 
{ 
    const QPainterPath::Element & element = path.elementAt(i); 
    newPath.moveTo(element.x, element.y); 
} 
painter.drawPath(newPath); 

모든 좋은 작품! 모든 요소 수에 대한 시간 오버 헤드가 고정되어 있습니다.

내 코드의 속도를 높이기위한 제안이 있으십니까?

UDPATE :

QPainterPath을 읽고 다른 스레드에서에 요소를 추가하는 동안 오류가 있습니다. 호출 스택에 때때로 응용 프로그램이 충돌!!의

QtCored4.dll qt_message_output (QtMsgType MSGTYPE, CONST의 char * 버피) 라인 2240 C++ QtCored4.dll qt_message (QtMsgType MSGTYPE, CONST의 char *의 MSG, 숯불 * AP = 연합 뉴스) 라인 2298 + 0x12 바이트 C++ QtCored4.dll! qFatal (const char * file, int line) Line 1999 + + 0x12 bytes C++ QtCored4.dll! qt_assert (const char * assertion, const char * 0x16 bytes C++ QtGuid4.dll! QPainterPath :: elementAt (int i) 405 + 0x36 바이트 C++ MyPlot.dll! MyPlot :: paintEvent (QPaintEvent * event) 줄 172 + 0x13 바이트 C++

elementAt (i)를 호출하는 동안 i == 4303이고 5459 개의 요소가 있습니다.

어쩌면 요소 수는 충돌 순간에 진짜가 아니겠습니까?

첫 번째 스레드가 충돌하는 동안 두 번째 스레드가 요소 수를 수정할 수 있습니까?

내 스레드 작동 방식 : 내 GUI 스레드는 읽기 전용 방법 만 사용합니다. 두 번째 스레드가 초당 1-5 천 개를 추가합니다.

+0

또는 동작을 수정하려면 QPainterPath에서 서브 클래 싱해야합니까? – k06a

+0

QPainterPath가 반복되는 동안 다른 스레드에서 QPainterPath가 수정되면 문제가 발생할 것입니다 ... 뮤텍스를 추가해야합니다 – Koying

+0

"반복"을 의미합니까? elementAt() 및 elementCount() 메서드 만 사용합니다 ... – k06a

답변

1

QPaintEngine 그래서 당신이 찾고있는 것이 아닙니다 ... 등 리눅스, Mac에서 코코아에 윈도우, X에 기본, 플랫폼 별 회화 엔진에 추상적 인 인터페이스, 즉 GDI에 있습니다.

QPainterPath을 편집하여 색칠하고 싶지 않은 요소를 제거하십시오. QPainterPath은 SVG와 같은 비트의 일종의 비트 맵이 아닌 기본 요소 목록 일뿐입니다.