QGraphicsView程序基本结构和功能实现
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include<QGraphicsScene>
#include<QGraphicsItem>
#include"qwgraphicsview.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QGraphicsScene *scene;
QLabel *labViewCord;
QLabel *labSceneCord;
QLabel *labItemCord;
void iniGraphicsSystem(); //创建Graphics View的各项
protected:
void resizeEvent(QResizeEvent *event);//重定义了resizeEvent()事件
private slots:
void on_mouseMovePoint(QPoint point);
void on_mouseClicked(QPoint point);
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
qwgraphicsview.h
#ifndef QWGRAPHICSVIEW_H
#define QWGRAPHICSVIEW_H
#include<QGraphicsView>
#include <QObject>
#include<qwgraphicsview.h>
#include"mainwindow.h"
/**
* 从QGraphicsView类继承一个类
* 实现mouseMoveEvent和mousePressEvent事件
* 把鼠标事件转换为信号,在主程序中设计槽函数响应这些鼠标事件
**/
class QWGraphicsView : public QGraphicsView
{
Q_OBJECT
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
public:
QWGraphicsView(QWidget *parent=nullptr);
signals:
void mouseMovePoint(QPoint point);
void mouseClicked(QPoint point);
};
#endif // QWGRAPHICSVIEW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"qwgraphicsview.h"
#include<QFlags>
#include<QPen>
#include<QGraphicsEllipseItem>
#include<QBrush>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
labViewCord=new QLabel("View 坐标:");
labViewCord->setMinimumWidth(150);
ui->statusBar->addWidget(labViewCord);
labSceneCord=new QLabel("Sence 坐标:");
labSceneCord->setMinimumWidth(150);
ui->statusBar->addWidget(labSceneCord);
labItemCord=new QLabel("Item 坐标:");
labItemCord->setMinimumWidth(150);
ui->statusBar->addWidget(labItemCord);
ui->View->setCursor(Qt::CrossCursor);//指针
ui->View->setMouseTracking(true);//该属性用来设置某个控件是否被跟踪轨迹。
ui->View->setDragMode(QGraphicsView::RubberBandDrag);
QObject::connect(ui->View,SIGNAL(mouseMovePoint(QPoint)),this,SLOT(on_mouseMovePoint(QPoint)));
QObject::connect(ui->View,SIGNAL(mouseClicked(QPoint)),this,SLOT(on_mouseClicked(QPoint)));
iniGraphicsSystem();
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief MainWindow::on_mouseClicked
* @param point
*/
void MainWindow::on_mouseClicked(QPoint point)//鼠标点击事件
{
QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标
QGraphicsItem *item=nullptr;
item=scene->itemAt(pointScene,ui->View->transform());//获取光标下的图形项
if(item!=nullptr)//判断是否有图形项
{
QPointF pointItem=item->mapFromScene(pointScene);//图形项的局部坐标
labItemCord->setText(QString::asprintf("Item坐标:%。0f,%。0f",pointItem.x(),pointItem.y()));
}
}
/**
* @brief MainWindow::on_mouseMovePoint
* @param point
*/
void MainWindow::on_mouseMovePoint(QPoint point)
/*
* 鼠标移动事件
* point是GraphicsView的坐标
* 是物理坐标
*/
{
labViewCord->setText(QString::asprintf("View坐标:%d,%d",point.x(),point.y()));
QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标
labSceneCord->setText(QString::asprintf("Sence坐标:%.0f,%.0f",pointScene.x(),pointScene.y()));
}
/**
* @brief MainWindow::resizeEvent
* @param event
*/
void MainWindow::resizeEvent(QResizeEvent *event)//窗口变化时事件
{
Q_UNUSED(event);
ui->label->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",ui->View->width(),ui->View->height()));
QRectF rectF=ui->View->sceneRect();//
ui->label_2->setText(QString::asprintf("GraphcsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
rectF.left(),rectF.top(),rectF.width(),rectF.height()));
}
void MainWindow::iniGraphicsSystem()//构造Graphics View中的各项
{
QRectF rect(-200,-100,400,200);//左上角的坐标,宽度,高度
scene=new QGraphicsScene(rect);//scene逻辑坐标系定义
ui->View->setScene(scene);
//画一个矩形,大小等于scene
QGraphicsRectItem *item=new QGraphicsRectItem(rect);
item->setFlags(QGraphicsItem::ItemIsSelectable|//设置flags
//QGraphicsItem::ItemIsMovable|
QGraphicsItem::ItemIsFocusable);
QPen pen;
pen.setWidth(2);
item->setPen(pen);
scene->addItem(item);
//画一个位于scene中心的椭圆
QGraphicsEllipseItem *item2=new QGraphicsEllipseItem(-100,-50,200,100);
item2->setPos(0,0);
item2->setBrush(QBrush(Qt::blue));
item2->setFlags(QGraphicsItem::ItemIsSelectable|
QGraphicsItem::ItemIsMovable|
QGraphicsItem::ItemIsFocusable);
scene->addItem(item2);
//画一个圆,中心位于scene的边缘
QGraphicsEllipseItem *item3=new QGraphicsEllipseItem(-50,-50,100,100);
item3->setPos(rect.right(),rect.bottom());
item3->setBrush(QBrush(Qt::red));
item3->setFlags(QGraphicsItem::ItemIsSelectable|
QGraphicsItem::ItemIsMovable|
QGraphicsItem::ItemIsFocusable);
scene->addItem(item3);
scene->clearSelection();
}
qwgraphicsview.cpp
#include "qwgraphicsview.h"
#include<QPoint>
#include<QMouseEvent>
/**
* @brief QWGraphicsView::QWGraphicsView
* @param parent
*/
QWGraphicsView::QWGraphicsView(QWidget *parent):QGraphicsView(parent)
{
}
/**
* @brief QWGraphicsView::mouseMoveEvent
* @param event
*/
void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件
{
QPoint point=event->pos();//QGraphicsView的坐标
emit mouseMovePoint(point);//发射信号
QGraphicsView::mouseMoveEvent(event);
}
/**
* @brief QWGraphicsView::mousePressEvent
* @param event
*/
void QWGraphicsView::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)//判断按下鼠标左键
{
QPoint point=event->pos();//获取坐标
emit mouseClicked(point);//发射信号
}
QGraphicsView::mousePressEvent(event);
}
运行结果