Article directory
1. Graphics View drawing architecture
- QPainter cannot realize the functions of selecting, editing, dragging and dropping, and modifying graphics.
- QGraphicScene (scene): can manage multiple graphics items
- QGraphicsltem (graphics item): that is, the primitive, supports mouse event response. For example: a rectangular graphic item
- QGraphicsView (view) : The associated scene allows visualization of all graphics items in the
scene View coordinates, scene coordinates, graphics item coordinates, coordinate mapping
QGraphicsView is Qt's graphics view component, grouped in the Display Widgets of the U Designer.
QGraphicsView has no signal related to mouseMoveEvent() and needs to inherit and customize a derived class
2. Simple example
Create project UI design
After dragging the component layout, MyGraphicView
add a new class to this project
Modify the inherited base class to: QGraphicsView
, and promote the component's base class to the class you just created.
Lift complete
detail code
mygraphicview.h
#ifndef MYGRAPHICVIEW_H
#define MYGRAPHICVIEW_H
#include <QObject>
#include <QWidget>
#include <QPoint>
#include <QGraphicsView>
#include <QMouseEvent>
class MyGraphicView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyGraphicView(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
signals:
void mouseMovePoint(QPoint point);
void mouseClick(QPoint point);
};
#endif // MYGRAPHICVIEW_H
mygraphicview.cpp
#include "mygraphicview.h"
MyGraphicView::MyGraphicView(QWidget *parent) : QGraphicsView(parent)
{
}
void MyGraphicView::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
QPoint point = event->pos(); //view坐标
emit mouseClick(std::move(point));
}
QGraphicsView::mousePressEvent(event);
}
void MyGraphicView::mouseMoveEvent(QMouseEvent *event)
{
QPoint point = event->pos();
emit mouseMovePoint(point);
QGraphicsView::mouseMoveEvent(event);
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QRectF>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QPen>
#include <QGraphicsScene>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QLabel* labViewCord;
QLabel* labSceneCord;
QLabel* labItemCord;
QGraphicsScene* Scene;
void initGraphics();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void resizeEvent(QResizeEvent *event) override;
private slots:
void on_mouseMovePoint(QPoint point);
void on_mouseClick(QPoint point);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
void MainWindow::initGraphics()
{
QRectF rect(-200,-100,400,200);
Scene = new QGraphicsScene(rect);
ui->graphicsView->setScene(Scene);
QGraphicsRectItem* item = new QGraphicsRectItem(rect);
item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable);
QPen pen;
pen.setWidth(2);
item->setPen(pen);
Scene->addItem(item);
QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100,-50,200,100);
item2->setFlags(QGraphicsItem::ItemIsFocusable
|QGraphicsItem::ItemIsSelectable
|QGraphicsItem::ItemIsMovable);
item2->setBrush(QBrush(Qt::blue));
Scene->addItem(item2);
QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50,-50,100,100);
item3->setFlags(QGraphicsItem::ItemIsFocusable
|QGraphicsItem::ItemIsSelectable
|QGraphicsItem::ItemIsMovable);
item3->setPos(rect.right(),rect.bottom());
item3->setBrush(QBrush(Qt::red));
Scene->addItem(item3);
}
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("Scene坐标:");
labSceneCord->setMinimumWidth(150);
ui->statusbar->addWidget(labSceneCord);
labItemCord = new QLabel("Item坐标:");
labItemCord->setMinimumWidth(150);
ui->statusbar->addWidget(labItemCord);
//设置光标-->光标跟踪
ui->graphicsView->setCursor(Qt::CrossCursor);
ui->graphicsView->setMouseTracking(true);
connect(ui->graphicsView,SIGNAL(mouseMovePoint(QPoint)),this,SLOT(on_mouseMovePoint(QPoint)));
connect(ui->graphicsView,SIGNAL(mouseClick(QPoint)),this,SLOT(on_mouseClick(QPoint)));
initGraphics();
ui->graphicsView->setCursor(Qt::CrossCursor);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
ui->label_viewSize->setText(QString::asprintf(
"Graphics view坐标,左上角总是(0,0),width=%d \t height=%d",
ui->graphicsView->width(),
ui->graphicsView->height()));
QRectF rect = ui->graphicsView->sceneRect();
ui->label_SceneRect->setText(QString::asprintf(
"Graphicsview::sceneRect=(x,y,w,h)=%.0f,%.0f,%.0f,%.0f",
rect.x(),rect.y(),rect.width(),rect.height()));
}
void MainWindow::on_mouseMovePoint(QPoint point)
{
labViewCord->setText(QString::asprintf("View坐标:%d,%d,", point.x(),point.y()));
QPointF pointScene = ui->graphicsView->mapToScene(point);
labSceneCord->setText(QString::asprintf("Scene坐标:%.0f,%.0f,",
pointScene.x(),pointScene.y()));
}
void MainWindow::on_mouseClick(QPoint point)
{
QPointF pointScene = ui->graphicsView->mapToScene(point);
QGraphicsItem* item = NULL;
item = Scene->itemAt(pointScene,ui->graphicsView->transform());
if(item!=NULL){
QPointF pointItem = item->mapFromScene(point);
labItemCord->setText(QString::asprintf("Item坐标:%.0f,%.0f,",
pointItem.x(),pointItem.y()));
}
}