Qt QGraphicsItem 在单独类的 boundingRect() 内绘制多边形?

Posted

技术标签:

【中文标题】Qt QGraphicsItem 在单独类的 boundingRect() 内绘制多边形?【英文标题】:Qt QGraphicsItem drawing a polygon within the boundingRect() of separate class? 【发布时间】:2015-12-13 18:43:42 【问题描述】:

我在一个新类中创建了一个 GraphicsItem 并绘制了一个多边形,但是,它不是在类的 boundingRect() 内绘制,而是在主 GraphicsView 上绘制的坐标处,我希望它会在里面绘制boundingRect()。

Detector::Detector()

    Pressed = false; //Initally the pressed boolean is false, it is not pressed
    setFlag(ItemIsMovable);
    

QRectF Detector::boundingRect() const

    return QRectF(780,425,70,40);


void Detector::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

    QRectF ItemBoundary = boundingRect();
    QBrush *fillBrush = new QBrush(QColor(83,71,65));


    QPolygon DetectorPolygon;
    DetectorPolygon << QPoint(0,0);
    DetectorPolygon << QPoint(20,10);
    DetectorPolygon << QPoint(70,10);
    DetectorPolygon << QPoint(70,20);
    DetectorPolygon << QPoint(20,20);
    DetectorPolygon << QPoint(0,40);

    QPen borderPen;
    borderPen.setWidth(2);
    borderPen.setColor(QColor(152,133,117));

    painter->setBrush(*fillBrush);
    painter->setPen(borderPen);
    painter->drawPolygon(DetectorPolygon);


//    painter->fillRect(ItemBoundary,*fillBrush);
//    painter->drawRect(ItemBoundary);


没有注释掉的最后两行将用一个矩形填充 boundingRect(),并且我可以将 ItemBoundary 变量传递给它,这与上面的多边形不同。

如何将 ItemBoundary (=BoundingRect()) 也传递给多边形?

编辑:本质上,我想绘制一个可以移动的多边形并作为一个单独的类发送到我的主用户界面中的 QGraphicsView。

【问题讨论】:

多边形和矩形之间的预期关系到底是什么?你想在矩形内居中多边形吗?缩放它以使其包含?我认为你的逻辑是错误的:boundingRect() reports 到 QGraphicsView,其中paint() 将绘制项目,而不是相反:boundingRect 不会影响绘制本身。也不要在堆上创建 QBrush,它会泄漏 - 而是在堆栈上创建它。 @FrankOsterfeld 多边形应该填充矩形。我想创建一个多边形作为 QGraphicsView 的一个单独的类,如果不需要 boundingRect 则可以,但我不知道。当我绘制多边形时,它出现在 GraphicsView 上,我无法移动它——即使它设置了 ItemIsMovable(我已将此添加到上面的主要问题中)。另外,您将如何正确地在堆栈上创建 QBrush - 每次我尝试都无法使用 QColor 设置颜色,只有这种方法有效。谢谢:D 关于 QBrush 的 NVM 我已经解决了,但其余的我仍然做不到:( painter-&gt;translate(780,425); 能解决您的问题吗?尽管 IMO 这很不直观——我宁愿让边界矩形从 (0,0) 开始,并将结果项移动到 (780,425)。 @FrankOsterfeld 是的!谢谢。当我将 boundingRect 的位置更改为 QRectF(0,0,70,30); 时,它不起作用(不可移动),但将其保持在 QRectF(780,425,70,30); 时它确实起作用了。谢谢:D您应该将其发布为答案。 【参考方案1】:

正如@FrankOsterfeld 所说:

painter-&gt;translate(780,425);

将项目移动到 boundingRect() 所在的区域。

【讨论】:

以上是关于Qt QGraphicsItem 在单独类的 boundingRect() 内绘制多边形?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos

Qt:强制 QGraphicsItem 更新

Qt:如何调整 QGraphicsItem 以动态改变大小

QT 4.5 - 更改 QGraphicsItem 的选择框

Qt Scaling Custom QGraphicsItem with unscaled text

QT 设置QGraphicsItem动起来