main.cpp
#include "myview.h"
#include "myitem.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
MyItem *item = new MyItem;
scene.addItem(item);
item->setPos(10,10);//场景坐标(相对于父项)
QGraphicsRectItem *rect_item = scene.addRect(QRect(0, 0, 100, 100), QPen(Qt::blue), QBrush(Qt::green));
rect_item->setPos(0,20);
item->setParentItem(rect_item);//将rect_item作为父项,相对于rect_item显示
//视图的左上角是视图的原点,背景图片的交点处是场景的原点(背景图片的左上角),而两个正方形的左上角分别是它们图形项坐标的原点
//如果添加了图形项,那么视图就会以图形项的原点为原点
rect_item->setRotation(45);//视图坐标和场景坐标没动,图形项坐标相对于原点进行了旋转
MyView view;
view.setScene(&scene);
view.setForegroundBrush(QColor(255, 255, 0, 100));
view.setBackgroundBrush(QPixmap("D:/img/333.jpeg"));
view.resize(400, 300);
view.show();
return a.exec();
}
myitem.h
#ifndef MYITEM_H
#define MYITEM_H
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem();
~MyItem();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};
#endif // MYITEM_H
myitem.cpp
#include "myitem.h"
#include <QPainter>
MyItem::MyItem()
{
}
MyItem::~MyItem()
{
}
//用来返回要绘制图形项的矩形区域:绘图显示的起点和大小没有变化;在图形项坐标上的可选位置发生了变化
//使用图形项坐标
QRectF MyItem::boundingRect() const
{
qreal pen_width = 1;
return QRectF(0 - pen_width / 2, 0 - pen_width / 2, 20 + pen_width, 20 + pen_width);
}
//用来执行实际的绘图操作,在图形项坐标的位置和大小
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->setBrush(Qt::red);
painter->drawRect(0, 0, 20, 20);
}
myview.h
#ifndef MYVIEW_H
#define MYVIEW_H
#include <QGraphicsView>
class MyView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QWidget *parent = nullptr);
~MyView();
protected:
void mousePressEvent(QMouseEvent *event);
};
#endif // MYVIEW_H
myview.cpp
#include "myview.h"
#include <QMouseEvent>
#include <QGraphicsItem>
#include <QDebug>
MyView::MyView(QWidget *parent)
: QGraphicsView(parent)
{
}
MyView::~MyView()
{
}
void MyView::mousePressEvent(QMouseEvent *event)
{
//获取鼠标单击处的视图、场景和图形项中的坐标
QPoint view_pos = event->pos();
QPointF scene_pos = mapToScene(view_pos);
QGraphicsItem *item = scene()->itemAt(scene_pos, QTransform());//scene()获取视图当前的场景的指针
if(item){
QPointF item_pos = item->mapFromScene(scene_pos);
qDebug() << "item_pos:" << item_pos;
}
qDebug() << "view_pos:" << view_pos << "scene_pos:" << scene_pos;
}