pixmaps的QList或pixmaps混淆指针的Qlist

时间:2018-06-12 18:29:11

标签: qt

我必须合并一些pixmaps,我想首先在qlist中添加它们然后合并它们。虽然我知道程序如何合并它们但我很困惑哪一个使用pixmaps的QList或指向pixmaps的指针的Qlist有什么区别,如果可以与pixmaps指针的qlist合并。

 GraphicsPixmapItem *pix =static_cast<QGraphicsPixmapItem *>(item1);
 QGraphicsPixmapItem *pix2 =static_cast<QGraphicsPixmapItem *>(item2);


 ////////////////Merge Pixmaps/////////////////////

 int pix_height=75;
 int pix_width=50;
 //use QList of pixmaps
 QList <QPixmap> dragImages;
 dragImages<<pix->pixmap()<<pix2->pixmap();//it works
 QSize dragPixSize(pix_width*dragImages.size()+50,pix_height);
 QPixmap dragpix(dragPixSize);
 dragpix.fill(Qt::transparent);
 QPainter painter;
 painter.begin(&dragpix);

 for(int i=0; i < dragImages.size(); ++i){
 painter.drawPixmap(pix_width*i,0,pix_width,pix_height,dragImages.at(i));
 }
 painter.end();
 //////////////////////////////////////////
 //or use Qlist of pointers to pixmaps?
 QList <QPixmap*> pix; //how do I add pix->pixmap() here? 

1 个答案:

答案 0 :(得分:2)

QPixmap是一个便宜的复制值,因此您不需要使用指针:您可以直接使用这些值。如果您不知道为什么需要使用QList:请勿使用它。在这种情况下已弃用 - 请使用QVector

首先,让我们从图形项向量中提取像素图:

#include <QtWidgets>
#include <algorithm>

using QPixmapVector = QVector<QPixmap>;

QPixmapVector getPixmaps(const QVector<QGraphicsItem*> &items) {
  QPixmapVector ret;
  for (auto item : items) {
    auto *pixItem = qgraphicsitem_cast<QGraphicsPixmapItem*>(item);
    if (pixItem)
      ret.push_back(pixItem->pixmap());
  }
  return ret;
}

然后,我们可以合并矢量中给出的像素图,在条带的右端留下一些额外的大小:

QPixmap mergePixmaps(const QPixmapVector &pixmaps, const QSize &extraSize) {
  auto size = extraSize;
  for (auto &pix : pixmaps) {
    size.setWidth(size.width() + pix.width());
    size.setHeight(std::max(size.height(), pix.height()));
  }
  QPixmap ret(size);
  ret.fill(Qt::transparent);
  QPainter p(&ret);
  int x = 0;
  for (auto &pix : pixmaps) {
    p.drawPixmap(x, 0, pix.width(), pix.height(), pix);
    x += pix.width();
  }
  return ret;
}

您想要的合并操作的特定变体是:

QPixmap myMerge(QGraphicsItem *item1, QGraphicsItem *item2) {
  auto pixmaps = getPixmaps({item1, item2});
  return mergePixmaps(pixmaps, {50, 75});
}