QT图形视图框架的坐标系统,点击位置显示坐标,图形旋转
#ifndef MYITEM_H
#define MYITEM_H
#include <QGraphicsItem>
class MyItem:public QGraphicsItem
{
public:
MyItem();
QRectF boundingRect() const;
void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget);
};
#endif // MYITEM_H
#ifndef MYVIEW_H
#define MYVIEW_H
//图形视图框架的坐标系统
#include <QGraphicsView>
class MyView:public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QWidget *parent=0);
protected:
void mousePressEvent(QMouseEvent *event);
};
#endif // MYVIEW_H
main.cpp
//#include <QCoreApplication>
#include <QApplication> //pro文件,QT+=widgets
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QDebug>
#include <QGraphicsView>
#include "myitem.h"
#include "myview.h"
//QT图形视图框架-场景
int main(int argc, char *argv[])
{
// QCoreApplication a(argc, argv); //qwidget:cannot creat a qwidget without qapplication
//改为QApplication
QApplication a(argc, argv);
//新建场景
QGraphicsScene scene;
//创建矩形--图形项
// //QGraphicsRectItem *item2=new QGraphicsRectItem(0,0,100,100);
// MyItem *item2=new MyItem;
// //为场景创建视图
// //将图形项添加到场景中
// scene.addItem(item2);
// //输出(50,50)点处的图形项
// qDebug()<<scene.itemAt(50,50,QTransform());
// QGraphicsView view2(&scene);
// view2.setForegroundBrush(QColor(255,255,0,100));
// //设置场景的背景图片
// view2.setBackgroundBrush(QPixmap("./lpyou.png")); //lpyou.png在build-src11_1b-Desktop_Qt_6_4_0_MinGW_64_bit-Debug 目录
// view2.resize(800,600);
// view2.show();
// QGraphicsView view3(&scene);
// view3.setForegroundBrush(QColor(255,255,0,100));
// view3.resize(400,300);
// view3.show();
scene.setSceneRect(0,0,400,300);//将创景的原点显示在视图的左上角
MyItem *item2=new MyItem;
//item2->setZValue(1);//item移动到rectItem之上--红矩形在绿矩形之上
scene.addItem(item2);
item2->setPos(10,10);
QGraphicsRectItem *rectItem=scene.addRect(QRect(0,0,100,100),
QPen(Qt::blue),QBrush(Qt::green));
item2->setParentItem(rectItem);
rectItem->setRotation(45);//旋转45度
rectItem->setPos(20,20);
MyView view2;
view2.setScene(&scene);
view2.setForegroundBrush(QColor(255,255,0,100));
view2.setBackgroundBrush(QPixmap("./lpyou.png")); //lpyou.png在build-src11_1b-Desktop_Qt_6_4_0_MinGW_64_bit-Debug 目录
view2.resize(600,500);
view2.show();
return a.exec();
}
#include "myitem.h"
#include <QPainter>
MyItem::MyItem()
{
}
QRectF MyItem::boundingRect() const
{
qreal penWidth=1;
return QRectF(0-penWidth/2,0-penWidth/2,20+penWidth,20+penWidth);
}
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->setBrush(Qt::red);
painter->drawRect(0,0,20,20);
}
#include "myview.h"
#include <QMouseEvent>
#include <QGraphicsItem>
#include <QDebug>
MyView::MyView(QWidget *parent):QGraphicsView(parent)
{
}
void MyView::mousePressEvent(QMouseEvent *event)
{
//分别获取鼠标单击处在视图,场景和图形项中的坐标,并输出
QPoint viewPos=event->pos();
qDebug()<<"viewPos: "<<viewPos;
QPointF scenePos=mapToScene(viewPos);
qDebug()<<"scenePos: "<<scenePos;
QGraphicsItem *item2=scene()->itemAt(scenePos,QTransform());
if(item2)
{
QPointF itemPos=item2->mapFromScene(scenePos);
qDebug()<<"itemPos: "<<itemPos;
}
//这里先使用鼠标事件对象event获取了鼠标单击位置的视图中的坐标,然后使用映射函数这个坐标转换为了场景中的坐标,
//并使用了scene()函数获取视图当前的场景的指针,然后使用QGraphicsScene::ItemAt()函数获取了场景中该坐标处的图形项。
//如果这里有图形项,那么便输出该点在图形项坐标系统中的坐标
}
//这里先使用鼠标事件对象event获取了鼠标单击位置的视图中的坐标,然后使用映射函数这个坐标转换为了场景中的坐标,
//并使用了scene()函数获取视图当前的场景的指针,然后使用QGraphicsScene::ItemAt()函数获取了场景中该坐标处的图形项。
//如果这里有图形项,那么便输出该点在图形项坐标系统中的坐标