QT- QImage и проблема многопоточности

Привет всем,

См. Изображение по адресу: http://i48.tinypic.com/316qb78.jpg

Мы разрабатываем приложение для извлечения краев клеток из изображений MRC с электронного микроскопа.

В формате файла MRC хранятся объемные пиксельные данные (http://en.wikipedia.org/wiki/Voxel), и мы просто используем массив 3D char (char ***) для загрузки и хранения данных (значений шкалы серого) из файла MRC.

Как показано на изображении, есть 3 средства просмотра для отображения плоскостей XY, YZ и ZX соответственно. Полосы прокрутки в верхней части средств просмотра используются для изменения среза изображения по оси.

Вот шаги, которые мы делаем, когда пользователь меняет положение полосы прокрутки.

1) получить новое значение полосы прокрутки. (Это выбранный фрагмент)

2) для соответствующей плоскости (YZ, XY или ZX) сгенерируйте массив (char * slice;) для выбранного среза, прочитав массив 3D char (char ***)

3) Создайте новый QImage * (Format_RGB888) и установите значения пикселей, прочитав 'slice' (используя img-> setPixel (x, y, c);)

4) Этот новый QImage * отрисовывается в методе paintEvent ().

Мы собираемся выполнить процесс "обнаружения края" в отдельном потоке, поскольку это интенсивный процесс. Во время этого процесса нам нужно нарисовать обнаруженную кривую (набор пикселей) поверх QImage *. (Как слой). Это означает, что нам нужно вызвать методы drawPoint () вне потока QT.

Это лучший способ использовать QImage в этом случае?

Как лучше всего выполнять методы рисования QT из другого потока?

заранее спасибо,


person Ashika Umanga Umagiliya    schedule 17.06.2010    source источник


Ответы (1)


Из документации QImage:

Поскольку QImage является подклассом QPaintDevice, QPainter можно использовать для рисования непосредственно на изображениях. При использовании QPainter на QImage рисование может выполняться в другом потоке, отличном от текущего потока графического интерфейса.

Просто создайте QPainter на своем изображении и нарисуйте то, что вам нужно.

person Kamil Klimek    schedule 17.06.2010
comment
Однако обратите внимание, что когда вы рисуете изображение на экране, вы получаете только текущее состояние изображения ... рисование большего количества изображения не изменит то, что отображается на экране, если вы не обновите виджет, показывающий изображение. К счастью, сигнал / слот или таймер решат это довольно легко. - person Caleb Huitt - cjhuitt; 17.06.2010