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