[英]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)。
boundingRect
实现关闭了吗? 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.