Qt (12) Graphics View Drawing Architecture (1)

1. Graphics View drawing architecture

insert image description here

  • 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

insert image description here

2. Simple example

Create project UI design

insert image description here

After dragging the component layout, MyGraphicViewadd a new class to this project
insert image description here
Modify the inherited base class to: QGraphicsView, and promote the component's base class to the class you just created.
insert image description here
Lift complete
insert image description here

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()));

    }
}

Effect demonstration

insert image description here

Guess you like

Origin blog.csdn.net/wsp_1138886114/article/details/123499424