QGraphicsView根据中心点绘制交叉C++
时间: 2023-09-18 08:11:45 浏览: 90
QGraphicsView架构实现基本图形的绘制
5星 · 资源好评率100%
可以通过以下步骤在QGraphicsView中绘制交叉:
1. 在QGraphicsView的构造函数中创建一个QGraphicsScene对象,并将其设置为视图的场景。
2. 创建一个自定义的QGraphicsItem对象,用于绘制交叉。
3. 在自定义的QGraphicsItem对象的paint()函数中,使用QPainter绘制交叉。
4. 将自定义的QGraphicsItem对象添加到QGraphicsScene中。
5. 在QGraphicsView的resizeEvent()函数中,获取视图的中心点,并将其传递给自定义的QGraphicsItem对象,以便它可以根据中心点重新定位。
以下是示例代码:
```cpp
#include <QtWidgets>
class CrossItem : public QGraphicsItem
{
public:
CrossItem(QGraphicsItem *parent = nullptr)
: QGraphicsItem(parent)
{
}
QRectF boundingRect() const override
{
return QRectF(-20, -20, 40, 40);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
{
painter->drawLine(QPointF(-20, 0), QPointF(20, 0));
painter->drawLine(QPointF(0, -20), QPointF(0, 20));
}
void setCenter(const QPointF& center)
{
setPos(center);
}
};
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget *parent = nullptr)
: QGraphicsView(parent)
{
QGraphicsScene *scene = new QGraphicsScene(this);
setScene(scene);
CrossItem *crossItem = new CrossItem();
scene->addItem(crossItem);
setRenderHint(QPainter::Antialiasing);
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}
protected:
void resizeEvent(QResizeEvent *event) override
{
QGraphicsView::resizeEvent(event);
QPointF center = mapToScene(viewport()->rect().center());
QGraphicsScene *scene = this->scene();
foreach(QGraphicsItem *item, scene->items())
{
CrossItem *crossItem = qgraphicsitem_cast<CrossItem*>(item);
if (crossItem)
crossItem->setCenter(center);
}
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GraphicsView view;
view.setSceneRect(-100, -100, 200, 200);
view.show();
return a.exec();
}
```
在上面的示例中,CrossItem类是一个自定义的QGraphicsItem对象,用于绘制交叉。在paint()函数中,我们使用QPainter绘制两条线,形成一个交叉。
在GraphicsView类的构造函数中,我们创建一个QGraphicsScene对象,并将其设置为视图的场景。然后,我们创建一个CrossItem对象,并将其添加到场景中。注意,我们还通过setRenderHint()和setViewportUpdateMode()函数设置了视图的一些属性。
在resizeEvent()函数中,我们获取视图的中心点,并将其传递给CrossItem对象,以便它可以根据中心点重新定位。注意,我们使用mapToScene()函数将视图坐标转换为场景坐标。
阅读全文