图形项坐标

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值