Проблемы с объединением нескольких QPixmaps - PullRequest
1 голос
/ 31 мая 2019

Я занимаюсь разработкой приложения, похожего на художника, и хочу, чтобы в моем приложении было несколько слоев для разных рисунков.Для этой цели у меня есть массив, который содержит QPixmaps с прозрачным фоном, и у меня есть функция, которая объединяет два QPixmaps (рисует один на другой).Это сделано так:

    void MeasuresWidget::MergePixmaps(QPixmap source, QPixmap target)//draw source on target
{
    QPainter painter(&target);
    painter.drawPixmap(target.rect(),source,source.rect());
    painter.end();
    imageLabel->setPixmap(target);
}

Я на 100% уверен, что массив растровых изображений ( AllLayers массив) содержит весь чертеж, который я хочу.Теперь я хочу последовательно объединить все рисунки с исходным изображением.Вот как я пытаюсь добиться этого:

void MeasuresWidget::on_actionAct_triggered()
{
    ForMerging = &OriginalImage;
    for(int i=0;i<5;i++)
        MergePixmaps(AllLayers[i], *ForMerging);
}

, где ForMerging - временный объект QPixmap для слияния, а OriginalImage - это, несомненно, QPixMap, который содержит исходное изображение.Опять же, я на 100% уверен, что все слои содержат его изображение на прозрачном фоне.Проблема, с которой я сталкиваюсь, заключается в том, что в результате исходное изображение объединяется только с последним рисунком, то есть с AllLayers [4] .Например, если я заставлю i работать от 0 до 2 (не включая), результатом будет исходное изображение, объединенное только с AllLayers [1] .Я боролся с этой проблемой в течение некоторого времени и понятия не имею, что может быть не так, поэтому я ищу любую возможную помощь.

1 Ответ

1 голос
/ 31 мая 2019

Попробуйте объединить все QPixmap при одном вызове с MergePixmaps.Для этого измените переменную Source в функции MergePixmap на объект AllLayers, например:

void MeasuresWidget::MergePixmaps(AllLayers *source, QPixmap target)//draw source on target
{
    QPainter painter(&target);
    for(int i = 0; i < source->lenght();i++){ 
       painter.drawPixmap(target.rect(),source->at(i),source->at(i).rect());
    }
    painter.end();
    imageLabel->setPixmap(target);
}
...