gpt4 book ai didi

c++ - 隐藏超出边界的 QGraphicsItem 区域

转载 作者:行者123 更新时间:2023-11-30 03:23:16 26 4
gpt4 key购买 nike

我在 QGraphicsScene 中有一个 QGraphicsPixmap 项。该项目的标志设置为 ItemIsMovableItemIsSelectable。我如何确保当项目移出某个边界时 - 它可以是 QGraphicsScene 或只是固定坐标处的固定帧大小 - 该部分会隐藏?

例如。 enter image description here

篮球的左边部分被隐藏了。

最佳答案

你必须使用 setClipPath()

在下面的代码中,我创建了一个继承自 QGraphicsPixmapItem 的类(同样可以处理继承自 QGraphicsItem 的其他类)并且我创建了方法 setBoundaryPath() 接收一个指示可见区域的QPainterPath,例如在代码中使用:

QPainterPath path;
path.addRect(QRectF(100, 100, 400, 200));

QPainterPath 是一个矩形,其左上角是 QGraphicsScene 的点 (100, 100),宽度为 400,宽度为 200在高度上。

#include <QApplication>
#include <QGraphicsRectItem>
#include <QGraphicsView>

class GraphicsPixmapItem: public QGraphicsPixmapItem{

public:
GraphicsPixmapItem(const QPixmap & pixmap, QGraphicsItem *parent = 0):
QGraphicsPixmapItem(pixmap, parent)
{
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
if(!m_boundaryPath.isEmpty()){
QPainterPath path = mapFromScene(m_boundaryPath);
if(!path.isEmpty())
painter->setClipPath(path);
}
QGraphicsPixmapItem::paint(painter, option, widget);
}

QPainterPath boundaryPath() const{
return m_boundaryPath;
}
void setBoundaryPath(const QPainterPath &boundaryPath){
m_boundaryPath = boundaryPath;
update();
}

private:
QPainterPath m_boundaryPath;
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView view;
QGraphicsScene scene(0, 0, 600, 400);
view.setScene(&scene);
view.setBackgroundBrush(QBrush(Qt::gray));

GraphicsPixmapItem *p_item = new GraphicsPixmapItem(QPixmap(":/ball.png"));
p_item->setPos(100, 100);

// Define the area that will be visible
QPainterPath path;
path.addRect(QRectF(100, 100, 400, 200));

p_item->setBoundaryPath(path);
scene.addItem(p_item);

// the item is added to visualize the intersection
QGraphicsPathItem *path_item = scene.addPath(path, QPen(Qt::black), QBrush(Qt::white));
path_item->setZValue(-1);
view.show();
return a.exec();
}

enter image description here

enter image description here

您可以在 link 中找到示例代码.

关于c++ - 隐藏超出边界的 QGraphicsItem 区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50498219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com