Qt中绘图框架的使用例子

绘图框架的使用步骤:

1、创建自定类继承QGraphicsView(可以直接用QGraphicsView小部件)。

2、创建QGraphicsScene对象,在创建的时候初始化场景矩形框。并使用QGraphicsView部件的函数setScene将场景设置到视图中,这里小编测试不能再视图中放置多个场景,后面设置的场景会将之前的场景覆盖。但是一个场景可以设置给多个视图。

3、使用QGraphicsItem的子类图形或者自定义继承QGraphicsItem的图形项创建对象,可以使用到QPen、QBrush等相关绘图类进行渲染,之后通过QGraphicsScene的函数addItem()将其设置到场景中。至此简单的绘图框架绘制完成。

绘图框架中视图、场景和图形项位置坐标的对应关系(小编自己总结的)

当在视图中创建场景时,场景的坐标范围为场景矩形框的顶点加上长宽,例如在视图中添加一个场景矩形框为(-100,100,200,200)那么场景区域的左上角坐标为(-100,100),宽度为200,高度为200,也就是说视图的坐标范围为(-100,100)和(100,300),而对应的坐标原点(0,0)不在此范围之内。而场景和视图的对应关系是中心的对齐(通俗点就是视图的中心点和场景的中心点事重合的)。

当在场景中创建图形项的时候,图形项的位置有两种表示:

不设置setpos()坐标,这个时候会默认和场景中的坐标对应,也就是说这种情况下图形项的坐标和场景中的坐标是一一对应的。而图形项中坐标的范围就是图形项设置的矩形框顶点加上长宽(有可能(0,0)也不在这个范围之中)。但是一般情况下载创建图形项的时候会将(0,0)点设置为图形项的中心点。

设置setpos()函数,这个时候图形项的位置将会相对偏移setpos()函数设置的量,因此当设置了setpos()之后,场景和图形项之间就会从在一定的偏移量。

代码如下:

1、自定义的视图类

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H

#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>
class MyGraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    MyGraphicsView(QWidget *parent = 0);

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

signals:
    void mouseMovePoint(QPoint point);
    void mouseClicked(QPoint point);

};

#endif // MYGRAPHICSVIEW_H

#include "mygraphicsview.h"

MyGraphicsView::MyGraphicsView(QWidget *parent)
{

}

void MyGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    QPoint point = event->pos();
    emit mouseMovePoint(point);
    QGraphicsView::mouseMoveEvent(event);
}

void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        QPoint point = event->pos();
        emit mouseClicked(point);
    }
    QGraphicsView::mousePressEvent(event);
}

2、创建场景和图形项

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include "mygraphicsview.h"
#include <QGraphicsItem>
#include <QRectF>
#include <QPen>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;

private:
    QGraphicsScene* scene;
    QGraphicsScene* scene1;
    void initGraphicsSystem();//创建Graphics View各项

protected:
    void resizeEvent(QResizeEvent *event);

private slots:
    void mouseMovePoint(QPoint point);
    void mouseCliched(QPoint point);
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->graphicsView->setCursor(Qt::CrossCursor);
    ui->graphicsView->setMouseTracking(true);
    ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);

    QObject::connect(ui->graphicsView,&MyGraphicsView::mouseMovePoint,this,&MainWindow::mouseMovePoint);
    QObject::connect(ui->graphicsView,&MyGraphicsView::mouseClicked,this,&MainWindow::mouseCliched);

    initGraphicsSystem();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initGraphicsSystem()
{
    QRectF rect(-200,-100,400,200);
    scene = new QGraphicsScene(rect);//scene 逻辑坐标系定义

    ui->graphicsView->setScene(scene);
    ui->graphicsView_2->setScene(scene);
    //画框
    QGraphicsRectItem *item = new QGraphicsRectItem(rect);
    item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);
    QPen pen;
    pen.setWidth(2);
    item->setPen(pen);
    scene->addItem(item);


    //画框
    QGraphicsRectItem *item1 = new QGraphicsRectItem(-100,-50,200,100);
    item1->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsFocusable);
    item1->setPen(pen);

    scene->addItem(item1);
    scene->clearSelection();

}

void MainWindow::resizeEvent(QResizeEvent *event)
{

}

void MainWindow::mouseMovePoint(QPoint point)
{
    ui->label_view->setText(QString::asprintf("view 坐标 %d,%d",point.x(),point.y()));
    QPointF pointscene = ui->graphicsView->mapToScene(point);
    ui->label_sence->setText(QString::asprintf("scene 坐标 %0.f,%0.f",pointscene.x(),pointscene.y()));
}

void MainWindow::mouseCliched(QPoint point)
{
    QPointF pointscene = ui->graphicsView->mapToScene(point);
    QGraphicsItem *item = nullptr;
    item = scene->itemAt(pointscene,ui->graphicsView->transform());//获取光标下的图形
    if(item != nullptr){
        QPointF pointItem = item->mapFromScene(pointscene);//图形项局部坐标
        ui->label_item->setText(QString::asprintf("item 坐标 %0.f,%0.f",pointItem.x(),pointItem.y()));
    }
}

缩放

//旋转
void MainWindow::on_pushButton_3_clicked()
{
    item1->setRotation(100);//设置旋转角度
    item1->rotation();//开始旋转
}
//缩放
void MainWindow::on_pushButton_2_clicked()
{
    item1->setScale(1.2);//设置缩放系数
    item1->scale();//开始缩放
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值