Qt Graphics View 绘图架构

打印 上一主题 下一主题

主题 1033|帖子 1033|积分 3099

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Qt Graphics View 绘图架构















"QWGraphicsView.h" 头文件代码如下:
  1. #pragma once
  2. #include <QGraphicsView>
  3. class QWGraphicsView : public QGraphicsView
  4. {
  5.         Q_OBJECT
  6. public:
  7.         QWGraphicsView(QWidget *parent);
  8.         ~QWGraphicsView();
  9. protected:
  10.         void mouseMoveEvent(QMouseEvent *event);
  11.         void mousePressEvent(QMouseEvent *event);
  12. signals:
  13.         void mouseMovePoint(QPoint point);
  14.         void mouseClicked(QPoint point);
  15. };
复制代码
mouseMoveEvent()是鼠标移动事件,代码如下:
  1. //鼠标移动事件
  2. void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)
  3. {
  4.         QPoint point = event->pos();//QGraphicsView的坐标
  5.         emit mouseMovePoint(point); //释放信号
  6.         QGraphicsView::mouseMoveEvent(event);
  7. }
复制代码
       在此事件响应代码里,通过事件的pos()函数获取鼠标光标在视图中的坐标point,然后作为参数发射 mouseMovePoint(point)信号。如许,若在其他地方编写槽函数与此信号关联,就可以对鼠标移动事件作出响应。
mousePressEvent()是鼠标按键按下事件,代码如下:
  1. //鼠标左键按下事件
  2. void QWGraphicsView::mousePressEvent(QMouseEvent *event)
  3. {
  4.         if (event->button() == Qt::LeftButton)
  5.         {
  6.                 QPoint point = event->pos();//QGraphicsView的坐标
  7.                 emit mouseClicked(point);//释放信号
  8.         }
  9.         QGraphicsView::mousePressEvent(event);
  10. }
复制代码
       在此事件响应代码里,首先判断是否是鼠标左键按下,然后通过事件的pos()函数获取鼠标光标在视图中的坐标point,然后作为参数发射mouseClicked(point)信号。

"sample8_4QGraphicsView.h"  头文件代码如下:
  1. #pragma once
  2. #include <QtWidgets/QMainWindow>
  3. #include "ui_sample8_4QGraphicsView.h"
  4. #include    <QGraphicsScene>
  5. #include    <QLabel>
  6. class sample8_4QGraphicsView : public QMainWindow
  7. {
  8.         Q_OBJECT
  9. public:
  10.         sample8_4QGraphicsView(QWidget *parent = Q_NULLPTR);
  11. private:
  12.         Ui::sample8_4QGraphicsViewClass ui;
  13. protected:
  14.         void resizeEvent(QResizeEvent *event);
  15. private:
  16.         QGraphicsScene  *scene;
  17.         QLabel  *labViewCord;
  18.         QLabel  *labSceneCord;
  19.         QLabel  *labItemCord;
  20.         void iniGraphicsSystem(); //创建Graphics View的各项
  21. private slots:
  22.         void on_mouseMovePoint(QPoint point);
  23.         void on_mouseClicked(QPoint point);
  24. };
复制代码


  1. #include "sample8_4QGraphicsView.h"
  2. #include  "ui_sample8_4QGraphicsView.h"
  3. #include   <QGraphicsEllipseItem>
  4. //解决QT中中文显示乱码问题
  5. #pragma execution_character_set("utf-8")
  6. sample8_4QGraphicsView::sample8_4QGraphicsView(QWidget *parent)
  7.         : QMainWindow(parent)
  8. {
  9.         ui.setupUi(this);
  10.         labViewCord = new QLabel("View 坐标:");
  11.         labViewCord->setMinimumWidth(150);
  12.         ui.statusBar->addWidget(labViewCord);
  13.         labSceneCord = new QLabel("Scene 坐标:");
  14.         labSceneCord->setMinimumWidth(150);
  15.         ui.statusBar->addWidget(labSceneCord);
  16.         labItemCord = new QLabel("Item 坐标:");
  17.         labItemCord->setMinimumWidth(150);
  18.         ui.statusBar->addWidget(labItemCord);
  19.         ui.View->setCursor(Qt::CrossCursor);
  20.         ui.View->setMouseTracking(true);
  21.         ui.View->setDragMode(QGraphicsView::RubberBandDrag);
  22.         QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),
  23.                 this, SLOT(on_mouseMovePoint(QPoint)));
  24.         QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),
  25.                 this, SLOT(on_mouseClicked(QPoint)));
  26.         iniGraphicsSystem();
  27. }
复制代码
鼠标移动事件响应:
  1. //鼠标移动事件,point是 GraphicsView的坐标,物理坐标
  2. void sample8_4QGraphicsView::on_mouseMovePoint(QPoint point)
  3. {
  4.         labViewCord->setText(QString::asprintf("View 坐标:%d,%d", point.x(), point.y()));
  5.         QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
  6.         labSceneCord->setText(QString::asprintf("Scene 坐标:%.0f,%.0f", pointScene.x(), pointScene.y()));
  7. }
复制代码
鼠标单击事件响应:
  1. //鼠标单击事件
  2. void sample8_4QGraphicsView::on_mouseClicked(QPoint point)
  3. {
  4.         QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
  5.         QGraphicsItem  *item = NULL;
  6.         item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项
  7.         if (item != NULL) //有绘图项
  8.         {
  9.                 QPointF pointItem = item->mapFromScene(pointScene); //转换为绘图项的局部坐标
  10.                 labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(), pointItem.y()));
  11.         }
  12. }
复制代码
窗口变革大小时的事件:
  1. //窗口变化大小时的事件
  2. void sample8_4QGraphicsView::resizeEvent(QResizeEvent *event)
  3. {
  4.         Q_UNUSED(event);
  5.         //Graphics View坐标,左上角总是(0,0),宽度=,长度=
  6.         ui.labViewSize->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",
  7.                 ui.View->width(), ui.View->height()));
  8.         QRectF  rectF = ui.View->sceneRect(); //Scene的矩形区
  9.         ui.LabSceneRect->setText(QString::asprintf("QGraphicsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
  10.                 rectF.left(), rectF.top(), rectF.width(), rectF.height()));
  11. }
复制代码
构造Graphics View的各项:
  1. //构造Graphics View的各项
  2. void sample8_4QGraphicsView::iniGraphicsSystem()
  3. {
  4.         QRectF   rect(-200, -100, 400, 200);//左上角坐标,宽度,高度
  5.         scene = new QGraphicsScene(rect); //scene逻辑坐标系定义
  6.         ui.View->setScene(scene);
  7.         //画一个矩形框,大小等于scene
  8.         QGraphicsRectItem *item = new QGraphicsRectItem(rect); //矩形框正好等于scene的大小
  9.         item->setFlags(QGraphicsItem::ItemIsSelectable     //可选,可以有焦点,但是不能移动
  10.                 | QGraphicsItem::ItemIsFocusable);
  11.         QPen    pen;
  12.         pen.setWidth(2);
  13.         item->setPen(pen);
  14.         //item->setPos(500,0);//缺省位置在scene的(0,0)
  15.         scene->addItem(item);
  16.         //一个位于scene中心的椭圆,测试局部坐标
  17.         QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100, -50, 200, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
  18.         item2->setPos(0, 0);//设置椭圆中心位置
  19.         item2->setBrush(QBrush(Qt::blue));
  20.         item2->setFlags(QGraphicsItem::ItemIsMovable //可移动
  21.                 | QGraphicsItem::ItemIsSelectable  //可选择
  22.                 | QGraphicsItem::ItemIsFocusable); //可获得焦点
  23.         scene->addItem(item2);
  24.         //一个圆,中心位于scene的边缘
  25.         QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50, -50, 100, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
  26.         item3->setPos(rect.right(), rect.bottom());//设置圆中心位置
  27.         item3->setBrush(QBrush(Qt::red));
  28.         item3->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
  29.         scene->addItem(item3);
  30.         scene->clearSelection();
  31.         //item->setSelected(true);
  32.         //ui.View->setDragMode(QGraphicsView::RubberBandDrag);
  33. }
复制代码

运行效果如下:

"QWGraphicsView.cpp" 文件代码如下:
  1. #include "QWGraphicsView.h"#include    <QMouseEvent>#include    <QPoint>QWGraphicsView::QWGraphicsView(QWidget *parent)        : QGraphicsView(parent){}QWGraphicsView::~QWGraphicsView(){}//鼠标移动事件
  2. void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)
  3. {
  4.         QPoint point = event->pos();//QGraphicsView的坐标
  5.         emit mouseMovePoint(point); //释放信号
  6.         QGraphicsView::mouseMoveEvent(event);
  7. }
  8. //鼠标左键按下事件
  9. void QWGraphicsView::mousePressEvent(QMouseEvent *event)
  10. {
  11.         if (event->button() == Qt::LeftButton)
  12.         {
  13.                 QPoint point = event->pos();//QGraphicsView的坐标
  14.                 emit mouseClicked(point);//释放信号
  15.         }
  16.         QGraphicsView::mousePressEvent(event);
  17. }
复制代码
"sample8_4QGraphicsView.cpp"  文件代码如下:
  1. #include "sample8_4QGraphicsView.h"
  2. #include  "ui_sample8_4QGraphicsView.h"
  3. #include   <QGraphicsEllipseItem>
  4. //解决QT中中文显示乱码问题
  5. #pragma execution_character_set("utf-8")
  6. sample8_4QGraphicsView::sample8_4QGraphicsView(QWidget *parent)
  7.         : QMainWindow(parent)
  8. {
  9.         ui.setupUi(this);
  10.         labViewCord = new QLabel("View 坐标:");
  11.         labViewCord->setMinimumWidth(150);
  12.         ui.statusBar->addWidget(labViewCord);
  13.         labSceneCord = new QLabel("Scene 坐标:");
  14.         labSceneCord->setMinimumWidth(150);
  15.         ui.statusBar->addWidget(labSceneCord);
  16.         labItemCord = new QLabel("Item 坐标:");
  17.         labItemCord->setMinimumWidth(150);
  18.         ui.statusBar->addWidget(labItemCord);
  19.         ui.View->setCursor(Qt::CrossCursor);
  20.         ui.View->setMouseTracking(true);
  21.         ui.View->setDragMode(QGraphicsView::RubberBandDrag);
  22.         QObject::connect(ui.View, SIGNAL(mouseMovePoint(QPoint)),
  23.                 this, SLOT(on_mouseMovePoint(QPoint)));
  24.         QObject::connect(ui.View, SIGNAL(mouseClicked(QPoint)),
  25.                 this, SLOT(on_mouseClicked(QPoint)));
  26.         iniGraphicsSystem();
  27. }//鼠标移动事件,point是 GraphicsView的坐标,物理坐标
  28. void sample8_4QGraphicsView::on_mouseMovePoint(QPoint point)
  29. {
  30.         labViewCord->setText(QString::asprintf("View 坐标:%d,%d", point.x(), point.y()));
  31.         QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
  32.         labSceneCord->setText(QString::asprintf("Scene 坐标:%.0f,%.0f", pointScene.x(), pointScene.y()));
  33. }//鼠标单击事件
  34. void sample8_4QGraphicsView::on_mouseClicked(QPoint point)
  35. {
  36.         QPointF pointScene = ui.View->mapToScene(point); //转换到Scene坐标
  37.         QGraphicsItem  *item = NULL;
  38.         item = scene->itemAt(pointScene, ui.View->transform()); //获取光标下的绘图项
  39.         if (item != NULL) //有绘图项
  40.         {
  41.                 QPointF pointItem = item->mapFromScene(pointScene); //转换为绘图项的局部坐标
  42.                 labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f", pointItem.x(), pointItem.y()));
  43.         }
  44. }//构造Graphics View的各项
  45. void sample8_4QGraphicsView::iniGraphicsSystem()
  46. {
  47.         QRectF   rect(-200, -100, 400, 200);//左上角坐标,宽度,高度
  48.         scene = new QGraphicsScene(rect); //scene逻辑坐标系定义
  49.         ui.View->setScene(scene);
  50.         //画一个矩形框,大小等于scene
  51.         QGraphicsRectItem *item = new QGraphicsRectItem(rect); //矩形框正好等于scene的大小
  52.         item->setFlags(QGraphicsItem::ItemIsSelectable     //可选,可以有焦点,但是不能移动
  53.                 | QGraphicsItem::ItemIsFocusable);
  54.         QPen    pen;
  55.         pen.setWidth(2);
  56.         item->setPen(pen);
  57.         //item->setPos(500,0);//缺省位置在scene的(0,0)
  58.         scene->addItem(item);
  59.         //一个位于scene中心的椭圆,测试局部坐标
  60.         QGraphicsEllipseItem *item2 = new QGraphicsEllipseItem(-100, -50, 200, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
  61.         item2->setPos(0, 0);//设置椭圆中心位置
  62.         item2->setBrush(QBrush(Qt::blue));
  63.         item2->setFlags(QGraphicsItem::ItemIsMovable //可移动
  64.                 | QGraphicsItem::ItemIsSelectable  //可选择
  65.                 | QGraphicsItem::ItemIsFocusable); //可获得焦点
  66.         scene->addItem(item2);
  67.         //一个圆,中心位于scene的边缘
  68.         QGraphicsEllipseItem *item3 = new QGraphicsEllipseItem(-50, -50, 100, 100); //矩形框内创建椭圆,绘图项的局部坐标,左上角(-100,-50),宽200,高100
  69.         item3->setPos(rect.right(), rect.bottom());//设置圆中心位置
  70.         item3->setBrush(QBrush(Qt::red));
  71.         item3->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
  72.         scene->addItem(item3);
  73.         scene->clearSelection();
  74.         //item->setSelected(true);
  75.         //ui.View->setDragMode(QGraphicsView::RubberBandDrag);
  76. }//窗口变化大小时的事件
  77. void sample8_4QGraphicsView::resizeEvent(QResizeEvent *event)
  78. {
  79.         Q_UNUSED(event);
  80.         //Graphics View坐标,左上角总是(0,0),宽度=,长度=
  81.         ui.labViewSize->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",
  82.                 ui.View->width(), ui.View->height()));
  83.         QRectF  rectF = ui.View->sceneRect(); //Scene的矩形区
  84.         ui.LabSceneRect->setText(QString::asprintf("QGraphicsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f",
  85.                 rectF.left(), rectF.top(), rectF.width(), rectF.height()));
  86. }
复制代码
"main.cpp"  文件代码如下:
  1. #include "sample8_4QGraphicsView.h"
  2. #include <QtWidgets/QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5.         QApplication a(argc, argv);
  6.         sample8_4QGraphicsView w;
  7.         w.show();
  8.         return a.exec();
  9. }
复制代码

《Qt5/6 C++开发指南》

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表