QT5笔记:36. QGraphicsView 综合示例 (完结撒花!)
1.QT5笔记:1.UI文件设计与运行机制2.QT5笔记:2.可视化UI设计3.QT5笔记:6. QT 与 C++4.QT5笔记:5. QtCreator 的快捷键5.QT5笔记:4. 设置应用图标6.QT5笔记:3.手动撸界面和可视化托界面混合7.QT5笔记: 14. SpinBox的常用功能8.QT5笔记:13. QString 的常用功能9.QT5笔记:12. 字符串和数值之间的转换10.QT5笔记:11. Qt类库的模块11.QT5笔记:10. 容器类的迭代12.QT5笔记:9. QT的容器类13.QT5笔记: 8. QT的全局变量(基本数据类型、函数、宏)14.QT5笔记:7. 自定义类、自定义信号及类的元对象信息15.QT5笔记: 30. 二进制文件读写16.QT5笔记: 29. 文本文件读写17.QT5笔记: 28. SplashWindow 没听懂,无内容18.QT5笔记:27. MDI应用程序设计19.QT5笔记: 26. 多窗体应用程序设计20.QT5笔记: 25. 非模态的自定义对话框21.QT5笔记:24. 自定义对话框以及模态 调用22.QT5笔记: 23. 标准对话框23.QT5笔记: 22. 自定义代理24.QT5笔记: 21. QStandardItemModel25.QT5笔记: 20. QStringListModel的使用26.QT5笔记: 19. QFileSystemModel 联动 QListView QTableView QTreeView27.QT5笔记:18 QPainter基本绘图28.QT5笔记:17. QComboBox和QPlainTextEdit29.QT5笔记: 16. 时间和定时器的常用功能30.QT5笔记: 15. 其他显示组件的常用功能
31.QT5笔记:36. QGraphicsView 综合示例 (完结撒花!)
32.QT5笔记: 35. QGraphicsView 视图33.QT5笔记:34. 视口和窗口34.QT5笔记:33. 坐标系统和坐标变换35.QT5笔记: 32. QPainter 基本绘制36.QT5笔记: 31. 文件目录操作收起
通过此示例可以比较熟悉QGraphincsView的流程以及操作
坐标关系以及获取:
- View坐标:左上角为原点,通过鼠标移动事件获取
- Scene坐标:中心为原点,横竖为X,Y轴。通过View.mapToScene(View坐标)获取
- Item坐标:Item中心为原点,由于可旋转,X,Y轴方向不定。通过item.mapFromScene(Scene坐标,View.Transform)获取
View缩放:X、Y可以不同比例
ui->graphicsView->scale(1.1, 1.1);//放大 ui->graphicsView->scale(0.9, 0.9);//缩小 ui->graphicsView->resetTransform();//恢复比例 设置item可以拖动、选中、获取焦点
item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); 可以框选多个
ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);//鼠标框选 item缩放
item->setScale(item->scale() - 0.1);//缩小 item->setScale(item->scale() + 0.1);//放大 item->setScale(1);//恢复比例 item旋转
item->setRotation(item->rotation() - 3);//逆时针转3度 item->setRotation(item->rotation() + 3);//顺时针转3度 item前置&后置
item->setZValue(item->zValue() + 1);//前置 item->setZValue(item->zValue() - 1);//后置 item组合&打散
//组合 QGraphicsItemGroup *group = new QGraphicsItemGroup(); group->addToGroup(item); group->setFlags(QGraphicsItemGroup::ItemIsFocusable | QGraphicsItemGroup::ItemIsSelectable | QGraphicsItemGroup::ItemIsMovable); scene->addItem(group); //打散 QGraphicsItem *item = scene->selectedItems().at(i); if (item->type() == QGraphicsItemGroup::Type) { QGraphicsItemGroup *group = qgraphicsitem_cast<QGraphicsItemGroup *>(item); scene->destroyItemGroup(group); } item删除
scene->removeItem(item);//删除
例子:
GraphicsView.h重写的 QGraphicsView,重写鼠标、键盘事件
#ifndef GRAPHICSVIEW_H #define GRAPHICSVIEW_H #include <QGraphicsView> class GraphicsView : public QGraphicsView { Q_OBJECT public: explicit GraphicsView(QWidget *parent = nullptr); signals: void keyPress(QKeyEvent *event); void mouseDoubleClick(QPoint point); void mousePress(QPoint point); void mouseMove(QPoint point); // QWidget interface protected: void mouseDoubleClickEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void keyPressEvent(QKeyEvent *event) override; }; #endif // GRAPHICSVIEW_H
GraphicsView.cpp
#include "GraphicsView.h" #include <QMouseEvent> GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent) { } void GraphicsView::mouseDoubleClickEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { emit(mouseDoubleClick(event->pos())); } QGraphicsView::mouseDoubleClickEvent(event);//交还事件给父类处理 } void GraphicsView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { emit(mousePress(event->pos())); } QGraphicsView::mousePressEvent(event); } void GraphicsView::mouseMoveEvent(QMouseEvent *event) { emit(mouseMove(event->pos())); QGraphicsView::mouseMoveEvent(event); } void GraphicsView::keyPressEvent(QKeyEvent *event) { emit(keyPress(event)); QGraphicsView::keyPressEvent(event); }
MainWindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QGraphicsScene> #include <QLabel> #include <QMainWindow> #include <QMouseEvent> 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; QGraphicsScene *scene; static const int itemID = 1; static const int description = 2; int seqNum = 0;//item的ID序列 QLabel *labView = new QLabel("View坐标:", this); QLabel *labViewCoord = new QLabel("(000 , 000)\t", this); QLabel *labScene = new QLabel("Scene坐标:", this); QLabel *labSceneCoord = new QLabel("(000 , 000)\t", this); QLabel *labItem = new QLabel("Item坐标:", this); QLabel *labItemCoord = new QLabel("(000 , 000)\t", this); QLabel *labItemID = new QLabel("ItemID:", this); QLabel *labItemInfo = new QLabel("", this); private slots: void onKeyPress(QKeyEvent *event); void onMouseDoubleClick(QPoint point); void onMousePress(QPoint point); void onMouseMove(QPoint point); void on_actItem_Rect_triggered(); void on_actItem_Polygon_triggered(); void on_actItem_Triangle_triggered(); void on_actItem_Circle_triggered(); void on_actItem_Ellipse_triggered(); void on_actItem_Line_triggered(); void on_actItem_Text_triggered(); void on_actZoomIn_triggered(); void on_actZoomOut_triggered(); void on_actRestore_triggered(); void on_actRotateLeft_triggered(); void on_actRotateRight_triggered(); void on_actEdit_Front_triggered(); void on_actEdit_Back_triggered(); void on_actGroup_triggered(); void on_actGroupBreak_triggered(); void on_actEdit_Delete_triggered(); }; #endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QColorDialog> #include <QFontDialog> #include <QGraphicsRectItem> #include <QInputDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); scene = new QGraphicsScene(-300, -100, 600, 200); ui->graphicsView->setScene(scene); ui->graphicsView->setCursor(Qt::CrossCursor); ui->graphicsView->setMouseTracking(true); ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);//鼠标框选 ui->statusbar->addWidget(this->labView); ui->statusbar->addWidget(this->labViewCoord); ui->statusbar->addWidget(this->labScene); ui->statusbar->addWidget(this->labSceneCoord); ui->statusbar->addWidget(this->labItem); ui->statusbar->addWidget(this->labItemCoord); ui->statusbar->addWidget(this->labItemID); ui->statusbar->addWidget(this->labItemInfo); connect(ui->graphicsView, SIGNAL(keyPress(QKeyEvent *)), this, SLOT(onKeyPress(QKeyEvent *))); connect(ui->graphicsView, SIGNAL(mouseDoubleClick(QPoint)), this, SLOT(onMouseDoubleClick(QPoint))); connect(ui->graphicsView, SIGNAL(mousePress(QPoint)), this, SLOT(onMousePress(QPoint))); connect(ui->graphicsView, SIGNAL(mouseMove(QPoint)), this, SLOT(onMouseMove(QPoint))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_actItem_Rect_triggered()//矩形 { QBrush brush; brush.setColor(QColor(169, 134, 49, 200)); brush.setStyle(Qt::SolidPattern); QGraphicsRectItem *item = new QGraphicsRectItem(-50, -30, 100, 60); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setBrush(brush); item->setData(itemID, seqNum++); item->setData(description, "矩形"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Polygon_triggered()//梯形/多边形 { QBrush brush; brush.setColor(QColor(255, 78, 55)); brush.setStyle(Qt::Dense4Pattern); QVector<QPointF> points; points << QPointF(-50, -70) << QPointF(50, -70) << QPointF(70, -30) << QPointF(-70, -30); QPolygonF polygon = QPolygonF(points); QGraphicsPolygonItem *item = new QGraphicsPolygonItem(points); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setBrush(brush); item->setData(itemID, seqNum++); item->setData(description, "梯形"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Triangle_triggered()//三角形 { QBrush brush; brush.setColor(QColor(81, 181, 110)); brush.setStyle(Qt::Dense4Pattern); QVector<QPointF> points; points << QPointF(0, -30) << QPointF(-30, 0) << QPointF(30, 0); QPolygonF polygon = QPolygonF(points); QGraphicsPolygonItem *item = new QGraphicsPolygonItem(points); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setBrush(brush); item->setData(itemID, seqNum++); item->setData(description, "三角形"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Circle_triggered() { QBrush brush; brush.setColor(QColor(151, 151, 151)); brush.setStyle(Qt::SolidPattern); QGraphicsEllipseItem *item = new QGraphicsEllipseItem(0, 0, 10, 10); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setBrush(brush); item->setData(itemID, seqNum++); item->setData(description, "圆形"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Ellipse_triggered() { QBrush brush; brush.setColor(QColor(195, 195, 195)); brush.setStyle(Qt::Dense4Pattern); QGraphicsEllipseItem *item = new QGraphicsEllipseItem(0, 0, 15, 10); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setBrush(brush); item->setData(itemID, seqNum++); item->setData(description, "椭圆形"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Line_triggered() { QPen pen; pen.setWidth(2); QGraphicsLineItem *item = new QGraphicsLineItem(-100, 0, 100, 0); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setPen(pen); item->setData(itemID, seqNum++); item->setData(description, "直线"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actItem_Text_triggered() { QFont font; font.setPointSize(12); font.setFamily("MiSans"); QString text = QInputDialog::getText(this, "", "文本内容"); QGraphicsTextItem *item = new QGraphicsTextItem(text); item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsMovable); item->setFont(font); item->setData(itemID, seqNum++); item->setData(description, "文本"); scene->addItem(item); scene->clearSelection(); item->setSelected(true); } void MainWindow::on_actZoomIn_triggered()//放大 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setScale(item->scale() + 0.1); } } else { ui->graphicsView->scale(1.1, 1.1); } } void MainWindow::on_actZoomOut_triggered()//缩小 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setScale(item->scale() - 0.1); } } else { ui->graphicsView->scale(0.9, 0.9); } } void MainWindow::on_actRestore_triggered()//恢复比例 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setScale(1); } } else { ui->graphicsView->resetTransform();//恢复比例 } } void MainWindow::on_actRotateLeft_triggered()//左旋转 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setRotation(item->rotation() - 3); } } } void MainWindow::on_actRotateRight_triggered()//右旋转 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setRotation(item->rotation() + 3); } } } void MainWindow::on_actEdit_Front_triggered()//前置 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setZValue(item->zValue() + 1); } } } void MainWindow::on_actEdit_Back_triggered()//后置 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = 0; i < count; i++) { QGraphicsItem *item = scene->selectedItems().at(i); item->setZValue(item->zValue() - 1); } } } void MainWindow::on_actGroup_triggered()//组合 { int count = scene->selectedItems().count(); if (count > 0) { QGraphicsItemGroup *group = new QGraphicsItemGroup(); for (int i = count - 1; i >= 0; i--) { QGraphicsItem *item = scene->selectedItems().at(i); item->setSelected(false); group->addToGroup(item); } group->setFlags(QGraphicsItemGroup::ItemIsFocusable | QGraphicsItemGroup::ItemIsSelectable | QGraphicsItemGroup::ItemIsMovable); scene->addItem(group); group->setSelected(true); } } void MainWindow::on_actGroupBreak_triggered()//打散 { int count = scene->selectedItems().count(); if (count > 0) { for (int i = count - 1; i >= 0; i--) { QGraphicsItem *item = scene->selectedItems().at(i); if (item->type() == QGraphicsItemGroup::Type) { QGraphicsItemGroup *group = qgraphicsitem_cast<QGraphicsItemGroup *>(item); scene->destroyItemGroup(group); } } } } void MainWindow::on_actEdit_Delete_triggered()//删除 { int count = scene->selectedItems().count(); if (count != 0) { for (int i = count - 1; i >= 0; i--) { QGraphicsItem *item = scene->selectedItems().at(i); scene->removeItem(item); } } } void MainWindow::onMouseDoubleClick(QPoint point)//双击修改颜色或字体 { QPointF pointScene = ui->graphicsView->mapToScene(point); QGraphicsItem *item = scene->itemAt(pointScene, ui->graphicsView->transform()); if (item != nullptr) { switch (item->type()) { case QGraphicsRectItem::Type: {//矩形 QGraphicsRectItem *itemRect = qgraphicsitem_cast<QGraphicsRectItem *>(item); QBrush brush = itemRect->brush(); QColor color = QColorDialog::getColor(brush.color(), this, "选择一个颜色"); if (color.isValid()) { brush.setColor(color); itemRect->setBrush(brush); } break; } case QGraphicsPolygonItem::Type: {//多边形:梯形、三角形 QGraphicsPolygonItem *itemPolygon = qgraphicsitem_cast<QGraphicsPolygonItem *>(item); QBrush brush = itemPolygon->brush(); QColor color = QColorDialog::getColor(brush.color(), this, "选择一个颜色"); if (color.isValid()) { brush.setColor(color); itemPolygon->setBrush(brush); } break; } case QGraphicsEllipseItem::Type: {//椭圆 & 圆 QGraphicsEllipseItem *itemEllipse = qgraphicsitem_cast<QGraphicsEllipseItem *>(item); QBrush brush = itemEllipse->brush(); QColor color = QColorDialog::getColor(brush.color(), this, "选择一个颜色"); if (color.isValid()) { brush.setColor(color); itemEllipse->setBrush(brush); } break; } case QGraphicsTextItem::Type: {//文本 QGraphicsTextItem *itemText = qgraphicsitem_cast<QGraphicsTextItem *>(item); bool ok = false; QFont font = QFontDialog::getFont(&ok, itemText->font(), this, "选择字体", QFontDialog::DontUseNativeDialog); if (ok) { itemText->setFont(font); } QColor color = QColorDialog::getColor(itemText->defaultTextColor(), this, "选择一个颜色", QColorDialog::DontUseNativeDialog);//使用Qt的标准颜色对话框而不是操作系统的本机颜色对话框。 if (color.isValid()) { itemText->setDefaultTextColor(color); } break; } case QGraphicsLineItem::Type: {//直线 QGraphicsLineItem *itemLine = qgraphicsitem_cast<QGraphicsLineItem *>(item); QPen pen = itemLine->pen(); QColor color = QColorDialog::getColor(pen.color(), this, "选择一个颜色"); if (color.isValid()) { pen.setColor(color); itemLine->setPen(pen); } break; } default: break; } } } void MainWindow::onKeyPress(QKeyEvent *event) { QList<QGraphicsItem *> items = scene->selectedItems(); int count = items.count(); if (count > 0) { switch (event->key()) { case Qt::Key_Delete://刪除 case Qt::Key_Backspace://退格键 on_actEdit_Delete_triggered(); break; case Qt::Key_Left://左 for (int i = 0; i < count; i++) { QGraphicsItem *item = items.at(i); item->setX(item->x() - 1); } break; case Qt::Key_Right://右 for (int i = 0; i < count; i++) { QGraphicsItem *item = items.at(i); item->setX(item->x() + 1); } break; case Qt::Key_Up://上 for (int i = 0; i < count; i++) { QGraphicsItem *item = items.at(i); item->setY(item->y() - 1); } break; case Qt::Key_Down://下 for (int i = 0; i < count; i++) { QGraphicsItem *item = items.at(i); item->setY(item->y() + 1); } break; case Qt::Key_Space: on_actRotateRight_triggered(); break;//往右转 case Qt::Key_PageUp: on_actZoomIn_triggered(); break;//放大 case Qt::Key_PageDown: on_actZoomOut_triggered(); break;//缩小 } } } void MainWindow::onMousePress(QPoint point)//将鼠标点击的itemID显示在状态栏 { QPointF pointScene = ui->graphicsView->mapToScene(point); QGraphicsItem *item = scene->itemAt(pointScene, ui->graphicsView->transform()); if (item != nullptr) { labItemInfo->setText(item->data(itemID).toString()); } } void MainWindow::onMouseMove(QPoint point)//鼠标移动事件 { this->labViewCoord->setText(QString::asprintf("(%4d , %4d)\t", point.x(), point.y()));//View 坐標 QPointF pointScene = ui->graphicsView->mapToScene(point); this->labSceneCoord->setText(QString::asprintf("(%4.0f , %4.0f)\t", pointScene.x(), pointScene.y()));//Scene 坐標 QGraphicsItem *item = scene->itemAt(pointScene, ui->graphicsView->transform()); if (item != nullptr) { QPointF itemPoint = item->mapFromScene(pointScene);//item坐标 this->labItemCoord->setText(QString::asprintf("(%4.0f , %4.0f)\t", itemPoint.x(), itemPoint.x())); this->labItemInfo->setText(item->data(itemID).toString()); } else { this->labItemCoord->setText("(0000 , 0000)"); this->labItemInfo->setText(""); } }
reference:
NOTICE
- 参考视频到此还没有结束,但是我忘记写笔记了,emmmm,大家想看的,可以去B站看
__EOF__

本文作者:echo_lovely
本文链接:https://www.cnblogs.com/echo-lovely/p/17222278.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/echo-lovely/p/17222278.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2021-03-16 C# 自定义时间进度条