2014-01-14 4 views
2

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

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); 

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

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

ответ

1

Проблема в вашей логике заключается в том, что изображения цели и 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); 
[..] 
+0

Спасибо, что сделал трюк прекрасно вы могли бы объяснить, что происходит в 'painter_two.drawPixmap (targetRect, цели, sourceRect);' и почему мы создали новый 'QRectF' sourceRect ? – MistyD

+0

@MistyD рисует часть исходного изображения в целевой прямоугольной области. sourceRect создан, чтобы сделать код понятным, но технически вы можете его удалить и просто использовать «прямоугольник». – vahancho