qgraphicsview绘图_绘图之程序实例

点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达

共同学习共同进步

1、实例功能

    上节中只是演示了 Graphics View的基本结构和3个坐标系的概念,为了演示Graphics View结构编程的更多功能,创建如下实例

27d6c4fe3e9570bd8dc05a08f46b0a94.png

这个实例程序具有如下的功能。 

•可以创建矩形、椭圆、圆形、三角形、梯形、直线、文字等基本图形项。 

•每个图形项都可以被选择和拖动。

•图形项或整个整个视图可以缩放和旋转。 

•图形项重叠时,可以调整前置或后置。 

•多个图形项可以组合,也可以解除组合。 

•可以删除选择的图形项。 

•鼠标在视图上移动时,会在状态栏显示视图坐标和场景坐标。 

•鼠标单击某个图形项时,会显示图形项的局部坐标,也会显示图形项的文字描述和编号。 

•双击某个图形项时,会根据图形项的类型调用颜色对话框或字体对话框,设置图形项的填 充颜色、线条颜色或文字的字体。 

•选中某个图形项时,可以进行桉键橾作,Delete键删除图形项,PgUp放大,PgDn缩小,空格键旋转90°,上下左右光标键移动图形项。

2、自定义图形视图类QWGraphicsView

#pragma once#include class QWGraphicsView : public QGraphicsView{
        Q_OBJECTpublic:    QWGraphicsView(QWidget*parent = nullptr);    ~QWGraphicsView();protected:    void mouseMoveEvent(QMouseEvent* event);    void mousePressEvent(QMouseEvent* event);    void mouseDoubleClickEvent(QMouseEvent* event);    void keyPressEvent(QKeyEvent* event);signals:    void mouseMovePoint(QPoint point); //鼠标移动    void mouseClicked(QPoint point); //鼠标单击    void mouseDoubleClick(QPoint point); //双击事件    void keyPress(QKeyEvent* event); //按键事件};#include "QWGraphicsView.h"#include #include QWGraphicsView::QWGraphicsView(QWidget*parent)    : QGraphicsView(parent){
    }QWGraphicsView::~QWGraphicsView(){
    }void QWGraphicsView::mouseMoveEvent(QMouseEvent* event){
    //鼠标移动事件//    QPoint  point;    QPoint point = event->pos(); //QGraphicsView的坐标    emit mouseMovePoint(point); //释放信号    QGraphicsView::mouseMoveEvent(event);}void QWGraphicsView::mousePressEvent(QMouseEvent* event){ //鼠标左键按下事件    if (event->button() == Qt::LeftButton)    {
            //        QPoint  point;        QPoint point = event->pos(); //QGraphicsView的坐标        emit mouseClicked(point);//释放信号    }    QGraphicsView::mousePressEvent(event);}void QWGraphicsView::mouseDoubleClickEvent(QMouseEvent* event){ //鼠标双击事件    if (event->button() == Qt::LeftButton)    {
            //        QPoint  point;        QPoint point = event->pos(); //QGraphicsView的坐标        emit mouseDoubleClick(point);//释放信号    }    QGraphicsView::mouseDoubleClickEvent(event);}void QWGraphicsView::keyPressEvent(QKeyEvent* event){ //按键事件    emit keyPress(event);    QGraphicsView::keyPressEvent(event);}

3、主窗口的设计

#pragma once#include #include "QWGraphicsView.h"#include "ui_QGuiPainter.h"#include #include class QGuiPainter : public QMainWindow{
        Q_OBJECTpublic:    QGuiPainter(QMainWindow*parent = Q_NULLPTR);    ~QGuiPainter();private:    Ui::QGuiPainter ui;private:    static const int ItemId = 1;   //绘图项自定义数据的key    static const int ItemDesciption = 2;   //绘图项自定义数据的key    int seqNum = 0;    int backZ = 0;    int frontZ = 0;    QGraphicsScene* scene;    QLabel* labViewCord;    QLabel* labSceneCord;    QLabel* labItemCord;    QLabel* labItemInfo;private:    void myDrawFilledRect();    void myDrawTextureRect();    void myDrawGradient();    void myDrawShape(); //绘制基本图形    void myDrawPentagram();    void myDrawViewPort();protected:    void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;private slots:    void on_mouseMovePoint(QPoint point); //鼠标移动    void on_mouseClicked(QPoint point); //鼠标单击    void on_mouseDoubleClick(QPoint point); //鼠标双击    void on_keyPress(QKeyEvent* event); //按键    void actZoomIn_triggered();    void actZoomOut_triggered();    void actRestore_triggered();    void actRotateLeft_triggered();    void actRotateRight_triggered();    void actEditFront_triggered();    void actEditBack_triggered();   void actGroup_triggered();    void actGroupBreak_triggered();    void actEditDelete_triggered();    void actItemRect_triggered();    void actItemEllipse_triggered();    void actItemCircle_triggered();    void actItemTriangle_triggered();    void actItemPolygon_triggered();    void actItemLine_triggered();    void actItemText_triggered();};#include "QGuiPainter.h"#include #include #include #include #include #include #include #include #pragma execution_character_set("utf-8")template<class T> void setBrushColor(T* item){
    //函数模板    QColor color = item->brush().color();    color = QColorDialog::getColor(color, NULL, "选择填充颜色");    if (color.isValid())        item->setBrush(QBrush(color));}QGuiPainter::QGuiPainter(QMainWindow* parent)    : QMainWindow(parent){
        ui.setupUi(this);    setPalette(QPalette(Qt::white));//设置窗口为白色背景    setAutoFillBackground(true);    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);    labItemInfo = new QLabel("ItemInfo: ");    labItemInfo->setMinimumWidth(200);    ui.statusBar->addWidget(labItemInfo);    scene = new QGraphicsScene(-300, -200, 600, 200); //创建QGraphicsScene    ui.View->setScene(scene); //与view关联    ui.View->setCursor(Qt::CrossCursor); //设置鼠标    ui.View->setMouseTracking(true); //    ui.View->setDragMode(QGraphicsView::RubberBandDrag);    this->setCentralWidget(ui.View);    QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),        this, SLOT(on_mouseMovePoint(QPoint)));    QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),        this, SLOT(on_mouseClicked(QPoint)));    QObject::connect(ui.View, SIGNAL(mouseDoubleClick(QPoint)),        this, SLOT(on_mouseDoubleClick(QPoint)));    QObject::con
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值