Установить крестик в QImage в том месте, где нажато мышью - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть график, показанный в QImage, и я хочу установить крест (+) желтого цвета для измерения, если нажата правая кнопка мыши.

        void foo::mousePressEvent(QMouseEvent *event)
        {
         if (event->button() == Qt::RightButton) {
            QPoint pos = event->pos();
            int x = pos.x();
           int y = pos.y();
          QLine line(x-5,y,x+5,y);
          QLine line(x,y-5,x,y+5);
          QPainter painter(&my_image);
          painter.setPen( Qt::red );
          painter.setBrush( Qt::yellow );
/*
QPainter::begin: Cannot paint on an image with the QImage::Format_Indexed8 format
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
*/


              painter.drawLine(line); //no effect 

         }
        }

, если я делаю это в Paintevent (...), я уничтожаю оригинальную картинку.Как я могу это сделать.

Дополнительная информация: изображение индексируется.

 my_image.setColorCount(33);
    for(int i = 0;i<33;i++)
    {
        my_image.setColor(i,qRgb((unsigned char)palette[i*3], (unsigned char)palette[i*3+1], (unsigned char)palette[i*3+2]));
    }

my_imag имеет черный фон, и я хочу нарисовать крест белым цветом -> (это индекс 32)

int color = 32; // _ index_value_of_cross_color;

      for (int ix=x-5;ix<x+5;ix++) {
           my_image.setPixel(ix,y,color);
      }

      for (int iy=y-5;iy<y+5;iy++) {
           my_imag.setPixel(x,iy,color);
      }

но эффекта не вижу!

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Из ваших комментариев нельзя рисовать на QImage с Format_Indexed8.

Из документов QImage:

Предупреждение : Рисование на QImage с помощьюformat QImage :: Format_Indexed8 не поддерживается.

Выберите другой формат, например QImage :: Format_ARGB32_Premultiplied, и все должно работать.

1 голос
/ 02 декабря 2011

Другая быстрая и грязная альтернатива - просто установить значения в данных изображения.

Вам придется проделать немного больше работы - потому что нет команды строки, см. setpixel

int x = pos.x();
int y = pos.y();
int color = _index_value_of_cross_color;

for (int ix=x-5;ix<x+5;ix++) {
     my_image.setPixel(ix,y,color);
}

for (int iy=y-5;iy<y+5;iy++) {
     my_image.setPixel(x,iy,color);
}
...