我必须合并一些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?
答案 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});
}