图片:
应用到的知识点:
MainWindow中
限定图形项目的显示区域
resizeEvent事件大小的重写
on_mouseMovePoint鼠标移动事件的槽函数
on_mouseMoveClicked鼠标点击的槽函数
mygraphicsview中
视口范围内,最图形项目的操作信号
mousePressEvent鼠标按下事件的重写
mouseMoveEvent鼠标移动事件的重写
MainWindow.h-图形场景 就是可视化的视口界面
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLabel>
#include <QGraphicsScene>
QT_BEGIN_NAMESPACE
class MYGraphicsView;
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
MainWindow *self(){return m_self;}
protected:
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
private:
Ui::MainWindow *ui;
static MainWindow *m_self;
QLabel * labViewCord;
QLabel *labScenceCord;
QLabel *labItemCord;
void initQGraphics();
QGraphicsScene *scene;
MYGraphicsView * mygraph;
public slots:
void on_mouseMovePoint(QPoint point);
void on_mouseMoveClicked(QPoint point);
};
#endif
MYGraphicsView.h-图形窗口
#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
#include <QObject>
#include <QGraphicsView>
class MYGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MYGraphicsView(QWidget *parent = nullptr);
~MYGraphicsView();
MYGraphicsView *self(){return m_self;}
protected:
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
signals:
void mouseMovePoint(QPoint event);
void mouseMoveClicked(QPoint event);
public slots:
private:
static MYGraphicsView *m_self;
};
#endif
MainWindow.cpp -在视口范围内添加项目组件,且拿取项目组件的坐标 + 相对于窗口weidget的坐标
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "mygraphicsview.h"
#include <QGraphicsRectItem>
MainWindow *MainWindow::m_self = nullptr;
void MainWindow::initQGraphics()
{
QRectF rectf(-200, -100, 400, 200);
scene = new QGraphicsScene(rectf);
ui->graphicsView->setScene(scene);
QGraphicsRectItem *item = new QGraphicsRectItem(rectf);
item->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable);
QPen pen;
pen.setWidth(20);
item->setPen(pen);
scene->addItem(item);
QRectF rectf2(-100, -50, 200, 100);
QGraphicsEllipseItem *itemell = new QGraphicsEllipseItem(rectf2);
itemell->setPos(0,0);
itemell->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable |
QGraphicsItem::ItemIsMovable);
itemell->setBrush(Qt::blue);
scene->addItem(itemell);
QRectF rectf_3(-50, -50, 100, 100);
QGraphicsEllipseItem *itemell_2 = new QGraphicsEllipseItem(rectf_3);
itemell_2->setPos(rectf.width(),rectf.bottom());
itemell_2->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable |
QGraphicsItem::ItemIsMovable);
itemell_2->setBrush(Qt::red);
scene->addItem(itemell_2);
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow),labViewCord(NULL),labScenceCord(NULL),labItemCord(NULL),scene(NULL),mygraph(NULL)
{
ui->setupUi(this);
m_self = this;
m_self->mygraph = new MYGraphicsView;
initQGraphics();
labViewCord = new QLabel("view:");
labViewCord->setMinimumWidth(150);
ui->statusbar->addWidget(labViewCord);
labScenceCord = new QLabel("Scence:");
labScenceCord->setMinimumWidth(150);
ui->statusbar->addWidget(labScenceCord);
labItemCord = new QLabel("Item:");
labItemCord->setMinimumWidth(150);
ui->statusbar->addWidget(labItemCord);
ui->graphicsView->setCursor(Qt::CrossCursor);
ui->graphicsView->setMouseTracking(true);
connect(ui->graphicsView, &MYGraphicsView::mouseMovePoint, this, &MainWindow::on_mouseMovePoint);
connect(ui->graphicsView, &MYGraphicsView::mouseMoveClicked, this, &MainWindow::on_mouseMoveClicked);
}
MainWindow::~MainWindow()
{
delete ui;
m_self = NULL;
}
void MainWindow::resizeEvent(QResizeEvent *event)
{
ui->label->setText(QString::asprintf("Graphics View: "
"w = %d h = %d",
ui->graphicsView->width(),
ui->graphicsView->height()));
QRectF rectf = ui->graphicsView->sceneRect();
ui->label_2->setText(QString::asprintf("Graphics View::senceRect : "
"(l = %0.1f,r = %0.1f,w = %0.1f h = %0.1f)",
rectf.left(),
rectf.right(),
rectf.width(),
rectf.height()));
}
void MainWindow::on_mouseMovePoint(QPoint point)
{
static int i = 0;
qDebug() << "on_mouseMovePoint<-recv_signal" << "i== " << i++ <<endl;
labViewCord->setText(QString::asprintf("view: %d, %d", point.x(),\
point.y()));
QPointF pointScene = ui->graphicsView->mapToScene(point);
labScenceCord->setText(QString::asprintf("Scence: %.0f, %.0f", pointScene.x(),\
pointScene.y()));
}
void MainWindow::on_mouseMoveClicked(QPoint point)
{
QPointF pointScene = ui->graphicsView->mapToScene(point);
QGraphicsItem *item = NULL;
item = scene->itemAt(pointScene, ui->graphicsView->transform());
if(item != NULL)
{
QPointF pointfItem = item->mapFromScene(pointScene);
labItemCord->setText(QString::asprintf("Item:%0.1f, %0.1f", pointfItem.x(),
pointfItem.y()));
}
}
MYGraphicsView .cpp – 在实际使用中我们一般需要重构GraphicsView类的几个信号,提供给我们操作图层的信号
- 21.01.06
- 在实际使用中我们一般需要重构GraphicsView类的
- 几个信号,提供给我们操作图层的信号
#include "mygraphicsview.h"
#include <QMoveEvent>
#include <QDebug>
MYGraphicsView *MYGraphicsView::m_self = nullptr;
MYGraphicsView::MYGraphicsView(QWidget *parent) : QGraphicsView(parent)
{
m_self = this;
}
MYGraphicsView::~MYGraphicsView()
{
m_self = NULL;
}
void MYGraphicsView::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() == Qt::LeftButton)
{
QPoint point = event->pos();
emit mouseMoveClicked(point);
}
QGraphicsView::mousePressEvent(event);
}
void MYGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
static int j = 0;
if(event->buttons() == Qt::LeftButton)
{
QPoint point = event->pos();
emit mouseMovePoint(point);
qDebug()<<"mouseMoveEvent->send_signal" << "j== "<< j++ <<endl;
}
QGraphicsView::mouseMoveEvent(event);
}