QPixmap копирует содержимое квадрата, нарисованного в другое изображение

У меня есть изображение, на котором я рисую прямоугольник как таковой. После этого я пытаюсь скопировать содержимое прямоугольника на другой QLabel. Кажется, это работает, однако я не могу выровнять скопированное изображение, начиная с левого верхнего угла изображения. Вот что я делаю

QPixmap original_image; 
original_image.load("c:\\Images\\myimg.jpg");
original_image = original_image.scaled(ui.label->size().width(),ui.label->size().height());

//-----------------------------------------------------------------------
//Draw rectangle on this
QPixmap target_two(ui.label->size().width(),ui.label->size().height());
target_two.fill(Qt::transparent);     

QPixmap target(ui.label->size().width(),ui.label->size().height());
target.fill(Qt::transparent);    

QPainter painter(&target);
QPainter painter_two(&target_two);


QRegion r(QRect(0, 0, ui.label->size().width(), ui.label->size().height()), QRegion::RegionType::Rectangle);  //Region to start copying
painter.setClipRegion(r);
painter.drawPixmap(0, 0, original_image); //Draw the original image in the clipped region 


QRectF rectangle(x_start,y_start,clipRegion);
painter.drawRoundedRect(rectangle,0,0); //Last two parameters define the radius of the corners higher the radius more rounded it is

             QRegion r_two(rectangle.toRect(), QRegion::RegionType::Rectangle); 
             painter_two.setClipRegion(r_two);
             painter_two.drawPixmap(0,0,target); 


ui.label->setPixmap(target);    

ui.label_2->setPixmap(target_two);

Нижнее изображение - это изображение с красным прямоугольником внутри, и это нормально. Верхнее изображение - это копия содержимого квадрата, единственная проблема заключается в том, что он не начинается с верхнего левого угла.

Любые предложения о том, почему я не получаю скопированный контент в верхнем левом углу.


person MistyD    schedule 14.01.2014    source источник


Ответы (1)


Проблема в вашей логике заключается в том, что изображения target и target_two имеют одинаковые размеры - размер метки, и вы рисуете скопированное изображение в той же позиции, что и в исходной метке. Все идет нормально. Я бы решил это с помощью следующего кода:

[..]
// This both lines can be removed.
// QRegion r_two(rectangle.toRect(), QRegion::RegionType::Rectangle); 
// painter_two.setClipRegion(r_two);

// Target rect. in the left top corner.
QRectF targetRect(0, 0, rectangle.width(), rectangle.height());
QRectF sourceRect(rectangle);
// Draw only rectangular area of the source image into the new position.
painter_two.drawPixmap(targetRect, target, sourceRect);
[..]
person vahancho    schedule 14.01.2014
comment
Спасибо, что сработал идеально. Не могли бы вы объяснить, что происходит в painter_two.drawPixmap(targetRect, target, sourceRect); и почему мы создали новый QRectF sourceRect? - person MistyD; 14.01.2014
comment
@MistyD рисует часть исходного изображения в целевой прямоугольной области. sourceRect создан, чтобы сделать код более понятным, но технически вы можете отказаться от него и просто использовать «прямоугольник». - person vahancho; 14.01.2014