2013-04-29 6 views
0

로드 넷을 그리는 특정 대상이 있습니다. 그래서 나는 점 (x, y)의 숫자가 있고 그들을 연결하고 싶습니다 (drawLine 함수를 사용하여). 그들의 금액 (약 2 ~ 3 백만) 때문에 다른 스레드에서 처리해야하므로 문제는 어떻게해야합니까? 나는 드로잉을위한 특별한 영역을 가지고 있습니다 - QLabel. 나는 주 스레드 QPixmap을 통해 그것을 시도하고 모든 괜찮습니다,하지만 다른 스레드에서 신호/슬롯을 통해 그것을하려고 할 때 이미지가 나타납니다 : (다른 스레드의 QLabel에 페인트하는 방법

사실, 내가 좌표를 GUI로 변환 - drawLine 함수에 정수 인수가 있기 때문에 점을 부분적으로 만듭니 다. drawLine 함수에 정수 인수가 있기 때문에 (int x1, int x2, int y2)

이것은 내가 다른 스레드를 만드는 방법입니다. 하나의 기능을 실행, 그래서 내가 생각하는 가장 좋은 방법) 내가 미친 %가 될 것이기 때문에 QtConcurrent::run(this,&MainWindow::parseXML)

, 당신은 나에게 도움이되기를 바랍니다)

,691되는

P.S 나는 QPixmap이 멀티 스레딩 도면에서 지원되지 않는다는 것을 읽었습니다. 그래서 지금 어떻게 해야할지 잘 모르겠습니다. 당신은 Qt는 GUI 스레드가 아닌 다른 스레드에서 당신의 그림을해야 할 경우
QPainter can be used in a thread to paint onto QImage, QPrinter, and QPicture paint devices. Painting onto QPixmaps and QWidgets is not supported. On Mac OS X the automatic progress dialog will not be displayed if you are printing from outside the GUI thread.

답변

1

: 그리고 스레드 내에서이 같은 그 함수를 호출 할 수 있습니다. 이것이 바로 Qt가 제공하는 솔루션입니다.

질문에 - 별도의 스레드에서 그림을 수행하는 Qt에서 아니요 방법이 있습니다. 모든 위젯 클래스 다른 스레드에서 건드릴 수 없습니다. 제안 된 invokeMethod 호출은 실제로 비동기 콜백이며 주 스레드에서 실행을 위해 대기합니다. QImage을 생성하고 GUI 스레드로 전달한 다음 GUI에서 사용하게 할 수 있지만이 목적으로 정확하게 설계되고 최적화 되었기 때문에 장면 그래프 (QGraphicsView)로 작업하는 것이 좋습니다.

5

, 이렇게 :

  1. 당신의 비 GUI 스레드에서 만들 QImage 객체
  2. QPainter를 사용을 postEvent QImage 객체
  3. 사용의 QApplication :: 또는 QImage를 전달하는 대기 신호/슬롯 연결에 칠하는 것은
  4. 메인 스레드가 이제 QI 변환 할 수있는 스레드 안전 방식으로 메인 스레드를 통해 개체 mage 객체를 QPixmap으로 가져 와서 (이것은 상대적으로 빠르게 수행 할 것입니다) 평소와 같이 표시합니다.
+4

지연된 신호/슬롯 연결은 가야합니다 –

0

정말 나쁜 관행이 비록 - 작업자 스레드 내에서 GUI 스레드를 업데이트하고, 당신은 여전히 ​​QMetaObject::invokeMethod()

당신을 통해 GUI를 업데이트 할 수 있습니다 (-queued 연결 유형) 신호 슬롯을 통해 그것을 정말해야 invokeMethod() 통해 GUI를 업데이트하는 작업자 스레드에서 모든 함수를 실행해야합니다. 예를 들어 - 메인 클래스에서 void MainWindow::drawLine(int x1, int y1, int x2, int y2)과 같은 함수를 추가하면 QImage에 선이 그려집니다. (성능에 대한 관심과 Qt5 작업하는 경우 또는 바람직 QQuickView) 당신은 분명히 QGraphicsView를 찾고 있습니다

QMetaObject::invokeMethod(this,"drawLine", Q_ARG(int,x1), Q_ARG(int,y1), Q_ARG(int,x2), Q_ARG(int,y2)); 
+0

2 ~ 3 백만 번 완료해야하는 무언가에 대한 오버 헤드가 너무 큽니다. 성능이 2로 향상되면 놀라실 것입니다. 3 백만 개의 신호가 GUI 스레드에 전달됩니다. –

+0

QLabel에 페인팅하면, 화가와 함께 모든 라인을 스레드 내의 QImage에 그릴 수 있고 필요한만큼 자주 라벨을 업데이트 할 수 있습니다 (QElapsedTimer 및 timeout 후에 invokeMethod를 통해 QImage를 전달하여 " (QPixmap :: fromImage())를 사용하여 QLabel을 설정합니다) – Shf

관련 문제