QT-QImage и проблема многопоточности - PullRequest
1 голос
/ 17 июня 2010

Привет всем,

Пожалуйста, обратитесь к изображению на: http://i48.tinypic.com/316qb78.jpg

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

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

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

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

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

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

3) Создать новый QImage * (Format_RGB888) и установить значения пикселей читая «ломтик» (используя img-> SetPixel (х, у, с);)

4) Этот новый QImage * окрашен в Метод paintEvent ().

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

Это лучший способ использовать QImage для этого случая?

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

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

1 Ответ

4 голосов
/ 17 июня 2010

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

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

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

...