Qt第十七天 快来打我* 2022-04-04 09:18 290阅读 0赞 ## QGraphicsView程序基本结构和功能实现 ## mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #include<QGraphicsScene> #include<QGraphicsItem> #include"qwgraphicsview.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT private: QGraphicsScene *scene; QLabel *labViewCord; QLabel *labSceneCord; QLabel *labItemCord; void iniGraphicsSystem(); //创建Graphics View的各项 protected: void resizeEvent(QResizeEvent *event);//重定义了resizeEvent()事件 private slots: void on_mouseMovePoint(QPoint point); void on_mouseClicked(QPoint point); public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H qwgraphicsview.h #ifndef QWGRAPHICSVIEW_H #define QWGRAPHICSVIEW_H #include<QGraphicsView> #include <QObject> #include<qwgraphicsview.h> #include"mainwindow.h" /** * 从QGraphicsView类继承一个类 * 实现mouseMoveEvent和mousePressEvent事件 * 把鼠标事件转换为信号,在主程序中设计槽函数响应这些鼠标事件 **/ class QWGraphicsView : public QGraphicsView { Q_OBJECT protected: void mouseMoveEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event); public: QWGraphicsView(QWidget *parent=nullptr); signals: void mouseMovePoint(QPoint point); void mouseClicked(QPoint point); }; #endif // QWGRAPHICSVIEW_H mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include"qwgraphicsview.h" #include<QFlags> #include<QPen> #include<QGraphicsEllipseItem> #include<QBrush> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); labViewCord=new QLabel("View 坐标:"); labViewCord->setMinimumWidth(150); ui->statusBar->addWidget(labViewCord); labSceneCord=new QLabel("Sence 坐标:"); labSceneCord->setMinimumWidth(150); ui->statusBar->addWidget(labSceneCord); labItemCord=new QLabel("Item 坐标:"); labItemCord->setMinimumWidth(150); ui->statusBar->addWidget(labItemCord); ui->View->setCursor(Qt::CrossCursor);//指针 ui->View->setMouseTracking(true);//该属性用来设置某个控件是否被跟踪轨迹。 ui->View->setDragMode(QGraphicsView::RubberBandDrag); QObject::connect(ui->View,SIGNAL(mouseMovePoint(QPoint)),this,SLOT(on_mouseMovePoint(QPoint))); QObject::connect(ui->View,SIGNAL(mouseClicked(QPoint)),this,SLOT(on_mouseClicked(QPoint))); iniGraphicsSystem(); } MainWindow::~MainWindow() { delete ui; } /** * @brief MainWindow::on_mouseClicked * @param point */ void MainWindow::on_mouseClicked(QPoint point)//鼠标点击事件 { QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标 QGraphicsItem *item=nullptr; item=scene->itemAt(pointScene,ui->View->transform());//获取光标下的图形项 if(item!=nullptr)//判断是否有图形项 { QPointF pointItem=item->mapFromScene(pointScene);//图形项的局部坐标 labItemCord->setText(QString::asprintf("Item坐标:%。0f,%。0f",pointItem.x(),pointItem.y())); } } /** * @brief MainWindow::on_mouseMovePoint * @param point */ void MainWindow::on_mouseMovePoint(QPoint point) /* * 鼠标移动事件 * point是GraphicsView的坐标 * 是物理坐标 */ { labViewCord->setText(QString::asprintf("View坐标:%d,%d",point.x(),point.y())); QPointF pointScene=ui->View->mapToScene(point);//转换到Scene坐标 labSceneCord->setText(QString::asprintf("Sence坐标:%.0f,%.0f",pointScene.x(),pointScene.y())); } /** * @brief MainWindow::resizeEvent * @param event */ void MainWindow::resizeEvent(QResizeEvent *event)//窗口变化时事件 { Q_UNUSED(event); ui->label->setText(QString::asprintf("Graphics View坐标,左上角总是(0,0),宽度=%d,高度=%d",ui->View->width(),ui->View->height())); QRectF rectF=ui->View->sceneRect();// ui->label_2->setText(QString::asprintf("GraphcsView::sceneRect=(Left,Top,Width,Height)=%.0f,%.0f,%.0f,%.0f", rectF.left(),rectF.top(),rectF.width(),rectF.height())); } void MainWindow::iniGraphicsSystem()//构造Graphics View中的各项 { QRectF rect(-200,-100,400,200);//左上角的坐标,宽度,高度 scene=new QGraphicsScene(rect);//scene逻辑坐标系定义 ui->View->setScene(scene); //画一个矩形,大小等于scene QGraphicsRectItem *item=new QGraphicsRectItem(rect); item->setFlags(QGraphicsItem::ItemIsSelectable|//设置flags //QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsFocusable); QPen pen; pen.setWidth(2); item->setPen(pen); scene->addItem(item); //画一个位于scene中心的椭圆 QGraphicsEllipseItem *item2=new QGraphicsEllipseItem(-100,-50,200,100); item2->setPos(0,0); item2->setBrush(QBrush(Qt::blue)); item2->setFlags(QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsFocusable); scene->addItem(item2); //画一个圆,中心位于scene的边缘 QGraphicsEllipseItem *item3=new QGraphicsEllipseItem(-50,-50,100,100); item3->setPos(rect.right(),rect.bottom()); item3->setBrush(QBrush(Qt::red)); item3->setFlags(QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemIsFocusable); scene->addItem(item3); scene->clearSelection(); } qwgraphicsview.cpp #include "qwgraphicsview.h" #include<QPoint> #include<QMouseEvent> /** * @brief QWGraphicsView::QWGraphicsView * @param parent */ QWGraphicsView::QWGraphicsView(QWidget *parent):QGraphicsView(parent) { } /** * @brief QWGraphicsView::mouseMoveEvent * @param event */ void QWGraphicsView::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件 { QPoint point=event->pos();//QGraphicsView的坐标 emit mouseMovePoint(point);//发射信号 QGraphicsView::mouseMoveEvent(event); } /** * @brief QWGraphicsView::mousePressEvent * @param event */ void QWGraphicsView::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton)//判断按下鼠标左键 { QPoint point=event->pos();//获取坐标 emit mouseClicked(point);//发射信号 } QGraphicsView::mousePressEvent(event); } 运行结果 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoZVJvb2tpZTE_size_16_color_FFFFFF_t_70]: /images/20220404/740612d7b15b450caeacebd74dfd4a3f.png
相关 Qt第七天 QListWidget和QToolButton的用法 界面设计 1.混合式界面设计 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5 ╰+攻爆jí腚メ/ 2022年04月12日 10:50/ 0 赞/ 302 阅读
相关 QT第十天 QFileSystemModel 使用QFileSystemModel作为数据模型,QTreeView,QListView和QTableView为主要组件 在Tree Bertha 。/ 2022年04月11日 11:42/ 0 赞/ 309 阅读
相关 QT第二十七天 .pro文件 ------------------------------------------------- Project created Bertha 。/ 2022年04月10日 14:20/ 0 赞/ 312 阅读
相关 Qt第十五天 自定义对话框及其调用 QWDialogSize的创建 qwdialogsize.h ifndef QWDIALOGSIZE_H define QW 以你之姓@/ 2022年04月08日 12:41/ 0 赞/ 274 阅读
相关 Qt第十二天 QStandardItemModel的使用 实现功能: 打开一个文本文件,该文件为二维数据文件,通过字符串处理获取表头和各行各列数据,导入到QStandardItem Bertha 。/ 2022年04月08日 10:15/ 0 赞/ 390 阅读
相关 Qt第十一天 QStringListModel的使用 采用QStringListModel作为数据模型,QListView组件作为视图组件 演示了QStringListModel和 痛定思痛。/ 2022年04月08日 09:22/ 0 赞/ 250 阅读
相关 Qt第十三天 自定义代理 \\基类为QItemDelegate, 必须实现4个函数 //自定义代理组件必须继承一下四个函数,函数的原型都是固定的 //创建编辑组件 QW た 入场券/ 2022年04月05日 07:09/ 0 赞/ 408 阅读
相关 Qt第十八天 Graphics View绘图程序实例 \\可以创建矩形,椭圆,圆,三角形,梯形,直线,文字等基本图形项 每个图形项可以被选择,拖动,放缩,旋转 图形项的前置和后 逃离我推掉我的手/ 2022年04月04日 11:47/ 0 赞/ 354 阅读
相关 Qt第十七天 QGraphicsView程序基本结构和功能实现 mainwindow.h ifndef MAINWINDOW_H define MAINWINDOW_ 快来打我*/ 2022年04月04日 09:18/ 0 赞/ 291 阅读
相关 Qt第十六天’ 坐标变换 坐标平移 坐标旋转 坐标缩放 状态的保存和恢复 widget.h ifndef WIDGET_H define WIDGET 快来打我*/ 2022年04月04日 03:07/ 0 赞/ 271 阅读
还没有评论,来说两句吧...