210_QT_QGraphicsView--图形窗口,其中视口、窗口中项目创建的坐标

65 篇文章 7 订阅

图片:

在这里插入图片描述

应用到的知识点:

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 // MAINWINDOW_H

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 // MYGRAPHICSVIEW_H

MainWindow.cpp -在视口范围内添加项目组件,且拿取项目组件的坐标 + 相对于窗口weidget的坐标

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "mygraphicsview.h"
#include <QGraphicsRectItem>
MainWindow *MainWindow::m_self = nullptr;
//extern MYGraphicsView * mygraph = NULL;

void MainWindow::initQGraphics()
{
/*
 * 人为限定坐标点以及宽高
 * 可操作控件限定在rectf内
 * x y w h
*/
    QRectF rectf(-200, -100, 400, 200);
    scene = new QGraphicsScene(rectf);
    ui->graphicsView->setScene(scene);

/*
 * qgraphiccorrectem类提供了一个矩形项目,你可以添加到QGraphicsScene
*/
    QGraphicsRectItem *item = new QGraphicsRectItem(rectf);
/*
 * --ItemIsFocusable:
 * 该图形项支持键盘输入焦点。启用此标志将允许将键事件传递到
 * QGraphicsItem::keyPressEvent()和QGraphicsItem::keyReleaseEvent()。
 * --ItemIsSelectable:
 * 该图形项支持被选中
 * --ItemIsMovable:
 * 可拖拽
*/
    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);/*相对于rectf2项目视口的0,0点,非窗口的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());/*相对于rectf的0,0点,非窗口的0,0点*/
    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()));

    /*显示我们在整个视口中限定制的作的项目组件(控件)的rect*/
    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;
/*
 * (父widget)的坐标
*/
    labViewCord->setText(QString::asprintf("view: %d, %d", point.x(),\
                                           point.y()));

/*
 * 简单来说mapToScene()这个函数就是为了将之前(父widget)的坐标转换到目前的坐标系中去
 * mapToScene:
 * 将坐标系的点映射为场景中的点。
*/
    QPointF pointScene = ui->graphicsView->mapToScene(point);
    labScenceCord->setText(QString::asprintf("Scence: %.0f, %.0f", pointScene.x(),\
                                           pointScene.y()));

}

void MainWindow::on_mouseMoveClicked(QPoint point)
{
/*
 * 解析请看:205_QT_BUG_复式自写小项目的问题总结
*/
    QPointF pointScene = ui->graphicsView->mapToScene(point);
    QGraphicsItem *item = NULL;
    item = scene->itemAt(pointScene, ui->graphicsView->transform());
    if(item != NULL)
    {
        /*
         * mapFromScene:
         * 将场景中的(视口中的)项目组件的点映射为坐标系(窗口)的点。
        */
       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>
/*
 * 21.01.06
 * 在实际使用中我们一般需要重构GraphicsView类的
 * 几个信号,提供给我们操作图层的信号
*/
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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值