Qt(12)グラフィックビュー描画アーキテクチャ(1)

1.グラフィックスビューの描画アーキテクチャ

ここに画像の説明を挿入

  • QPainterは、グラフィックの選択、編集、ドラッグアンドドロップ、および変更の機能を実現できません。
  • QGraphicScene(シーン):複数のグラフィックアイテムを管理できます
  • QGraphicsltem(グラフィックアイテム):つまり、プリミティブは、マウスイベント応答をサポートします。例:長方形のグラフィックアイテム
  • QGraphicsView(ビュー):関連付けられたシーンにより、シーン内のすべてのグラフィックアイテムを視覚化できます。
    ビューの座標、シーンの座標、グラフィックアイテムの座標、座標マッピング

QGraphicsViewは、Qtのグラフィックビューコンポーネントであり、UDesignerの表示ウィジェットにグループ化されています。
QGraphicsViewにはmouseMoveEvent()に関連するシグナルがなく、派生クラスを継承してカスタマイズする必要があります

ここに画像の説明を挿入

2.簡単な例

プロジェクトのUIデザインを作成する

ここに画像の説明を挿入

コンポーネントレイアウトをドラッグした後、MyGraphicViewこのプロジェクトに新しいクラスを追加します
ここに画像の説明を挿入
。継承された基本クラスを次のように変更しQGraphicsView、コンポーネントの基本クラスを作成したばかりのクラスに昇格させます。
ここに画像の説明を挿入
リフト完了
ここに画像の説明を挿入

詳細コード

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

    }
}

効果のデモンストレーション

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wsp_1138886114/article/details/123499424