繁体   English   中英

绘制的自定义项目有时会在QGraphicsScene中砍掉

[英]Drawn custom items sometimes chopped off in QGraphicsScene

我有一个自定义图形项,它是从QGraphicsEllipseItem继承的。 具体来说,我的自定义项目只是带有标签的圆圈(我称其为“顶点”)。 我理解这个想法:从基类继承,实现某些方法,然后就完成了。

标头在这里:

#ifndef VERTEX_H
#define VERTEX_H

#include <QPointF>
#include <QGraphicsEllipseItem>

class Vertex : public QGraphicsEllipseItem
{
public:
    Vertex(const QPointF& pos, int label, int size = 20) : pos_(pos), label_(label), size_(size)  { }

    QRectF boundingRect() const;

protected:
    virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);

private:
    QPointF pos_;
    int label_;
    int size_;
};

#endif // VERTEX_H

这里的实现:

// vertex.cpp
#include "vertex.h"
#include <QPainter>

QRectF Vertex::boundingRect() const
{
    return QGraphicsEllipseItem(pos_.x(), pos_.y(), size_, size_).boundingRect();
}

void Vertex::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
    painter->drawEllipse(pos_, size_, size_);
    painter->drawText(pos_, QString::number(label_));
}

因为我的对象确实一个椭圆,所以我想在椭圆中利用矩形的实现。 但是,当我画画时似乎有些不对劲。 特别是,我可能会看到以下内容:

在此处输入图片说明

(以上内容来自QGraphicsScene)。

  1. 我的boundingRect实现关闭了吗?
  2. 还有其他原因导致“不良”绘图吗? 当用户单击QGraphicsScene时,我绘制了一个顶点,因此从mouseEvent->scenePos();提供了mouseEvent->scenePos(); Vertex构造函数的QPointF参数mouseEvent->scenePos(); ,其中mouseEvent的类型为QGraphicsSceneMouseEvent*

首先,您不会获得任何形式,也不需要继承QGraphicsEllipseItem ,最好从干净的开始,仅继承QGraphicsItem 常规椭圆项不会从中心点和半径绘制椭圆,因此其边界矩形实现将与您要绘制的椭圆不匹配。

由于本质上是绘制一个具有中心和半径的圆,因此正确的边界rect实现应返回QRectF(pos_.x() - size_ / 2, pos.y() - size_ /2, size_, size_)

您当前的实现不会返回覆盖您的商品的矩形,而是从其中心开始并向外移动很远:

在此处输入图片说明

OK,更多帮助:

  • 区分绝对坐标和相对坐标-鼠标单击产生的点实际上不会用于设置圆心,而是用于设置图形项的位置
  • 圆的中心实际上是相对于该项目的,因此它将是QPointF(radius, radius) ,在您的情况下为size_一半
  • 您真的不需要存储中心点
  • 如果您的边界矩形实现正确,那么一切都会正确绘制
  • 如果要使这些项目重叠,则必须为画家设置画笔,否则只会画出圆圈的轮廓

因此,在所需的位置和直径处创建一个圆并将其绘制为如下所示:

class Circle : public QGraphicsItem {
public:
    Circle(QPointF c, int r) {
        setPos(QPointF(c.x() - r, c.y() - r));
        radius = r;
    }
    QRectF boundingRect() const { return QRectF(pos(), pos() + QPointF(radius * 2, radius * 2)); }
    void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) {
        painter->setBrush(Qt::white);
        painter->drawEllipse(boundingRect());
        painter->drawText(boundingRect().center(), "C");
    }
private:
    int radius;
};

现在,这一切都能正确绘制:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM