点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达
共同学习共同进步
1、实例功能
上节中只是演示了 Graphics View的基本结构和3个坐标系的概念,为了演示Graphics View结构编程的更多功能,创建如下实例
这个实例程序具有如下的功能。
•可以创建矩形、椭圆、圆形、三角形、梯形、直线、文字等基本图形项。
•每个图形项都可以被选择和拖动。
•图形项或整个整个视图可以缩放和旋转。
•图形项重叠时,可以调整前置或后置。
•多个图形项可以组合,也可以解除组合。
•可以删除选择的图形项。
•鼠标在视图上移动时,会在状态栏显示视图坐标和场景坐标。
•鼠标单击某个图形项时,会显示图形项的局部坐标,也会显示图形项的文字描述和编号。
•双击某个图形项时,会根据图形项的类型调用颜色对话框或字体对话框,设置图形项的填 充颜色、线条颜色或文字的字体。
•选中某个图形项时,可以进行桉键橾作,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