30、QGraphicsview实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include    <QGraphicsScene>
#include    <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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;

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void    on_mouseMovePoint(QPoint point); //鼠标移动

    void    on_mouseClicked(QPoint point); //鼠标单击

    void    on_mouseDoubleClick(QPoint point); //鼠标双击

    void    on_keyPress(QKeyEvent *event); //按键


    void on_actItem_Rect_triggered();

    void on_actItem_Ellipse_triggered();

    void on_actItem_Polygon_triggered();

    void on_actEdit_Delete_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_actItem_Line_triggered();

    void on_actItem_Text_triggered();

    void on_actGroup_triggered();

    void on_actGroupBreak_triggered();

    void on_actItem_Circle_triggered();

    void on_actItem_Triangle_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>731</width>
    <height>460</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Graphics  View绘图</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWGraphicsView" name="View">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>641</width>
      <height>351</height>
     </rect>
    </property>
    <property name="renderHints">
     <set>QPainter::Antialiasing|QPainter::TextAntialiasing</set>
    </property>
    <property name="dragMode">
     <enum>QGraphicsView::RubberBandDrag</enum>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>731</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <property name="iconSize">
    <size>
     <width>16</width>
     <height>16</height>
    </size>
   </property>
   <property name="toolButtonStyle">
    <enum>Qt::ToolButtonTextUnderIcon</enum>
   </property>
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
   <addaction name="actZoomIn"/>
   <addaction name="actZoomOut"/>
   <addaction name="actRestore"/>
   <addaction name="separator"/>
   <addaction name="actRotateLeft"/>
   <addaction name="actRotateRight"/>
   <addaction name="actEdit_Front"/>
   <addaction name="actEdit_Back"/>
   <addaction name="actGroup"/>
   <addaction name="actGroupBreak"/>
   <addaction name="separator"/>
   <addaction name="actEdit_Delete"/>
   <addaction name="separator"/>
   <addaction name="actQuit"/>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <widget class="QToolBar" name="toolBar">
   <property name="windowTitle">
    <string>toolBar</string>
   </property>
   <property name="allowedAreas">
    <set>Qt::LeftToolBarArea</set>
   </property>
   <property name="iconSize">
    <size>
     <width>16</width>
     <height>16</height>
    </size>
   </property>
   <property name="toolButtonStyle">
    <enum>Qt::ToolButtonTextUnderIcon</enum>
   </property>
   <attribute name="toolBarArea">
    <enum>LeftToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
   <addaction name="actItem_Rect"/>
   <addaction name="actItem_Ellipse"/>
   <addaction name="actItem_Circle"/>
   <addaction name="actItem_Triangle"/>
   <addaction name="actItem_Polygon"/>
   <addaction name="actItem_Line"/>
   <addaction name="actItem_Text"/>
  </widget>
  <action name="actItem_Rect">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/RECTANGL.BMP</normaloff>:/images/images/RECTANGL.BMP</iconset>
   </property>
   <property name="text">
    <string>矩形</string>
   </property>
   <property name="toolTip">
    <string>添加矩形</string>
   </property>
  </action>
  <action name="actItem_Ellipse">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/ELLIPSE.BMP</normaloff>:/images/images/ELLIPSE.BMP</iconset>
   </property>
   <property name="text">
    <string>椭圆</string>
   </property>
   <property name="toolTip">
    <string>添加椭圆型</string>
   </property>
  </action>
  <action name="actItem_Line">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/LINE.BMP</normaloff>:/images/images/LINE.BMP</iconset>
   </property>
   <property name="text">
    <string>直线</string>
   </property>
   <property name="toolTip">
    <string>添加直线</string>
   </property>
  </action>
  <action name="actEdit_Delete">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/108.bmp</normaloff>:/images/images/108.bmp</iconset>
   </property>
   <property name="text">
    <string>删除</string>
   </property>
   <property name="toolTip">
    <string>删除选中的图元</string>
   </property>
  </action>
  <action name="actQuit">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/132.bmp</normaloff>:/images/images/132.bmp</iconset>
   </property>
   <property name="text">
    <string>退出</string>
   </property>
   <property name="toolTip">
    <string>退出本系统</string>
   </property>
  </action>
  <action name="actItem_Text">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/800.bmp</normaloff>:/images/images/800.bmp</iconset>
   </property>
   <property name="text">
    <string>文字</string>
   </property>
   <property name="toolTip">
    <string>添加文字</string>
   </property>
  </action>
  <action name="actEdit_Front">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/528.bmp</normaloff>:/images/images/528.bmp</iconset>
   </property>
   <property name="text">
    <string>前置</string>
   </property>
   <property name="toolTip">
    <string>居于最前面</string>
   </property>
  </action>
  <action name="actEdit_Back">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/526.bmp</normaloff>:/images/images/526.bmp</iconset>
   </property>
   <property name="text">
    <string>后置</string>
   </property>
   <property name="toolTip">
    <string>居于最后面</string>
   </property>
  </action>
  <action name="actItem_Polygon">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/FREEFORM.BMP</normaloff>:/images/images/FREEFORM.BMP</iconset>
   </property>
   <property name="text">
    <string>梯形</string>
   </property>
   <property name="toolTip">
    <string>添加梯形</string>
   </property>
  </action>
  <action name="actZoomIn">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/zoomin.png</normaloff>:/images/images/zoomin.png</iconset>
   </property>
   <property name="text">
    <string>放大</string>
   </property>
   <property name="toolTip">
    <string>放大</string>
   </property>
  </action>
  <action name="actZoomOut">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/zoomout.png</normaloff>:/images/images/zoomout.png</iconset>
   </property>
   <property name="text">
    <string>缩小</string>
   </property>
   <property name="toolTip">
    <string>缩小</string>
   </property>
  </action>
  <action name="actRotateLeft">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/rotateleft.png</normaloff>:/images/images/rotateleft.png</iconset>
   </property>
   <property name="text">
    <string>左旋转</string>
   </property>
   <property name="toolTip">
    <string>左旋转</string>
   </property>
  </action>
  <action name="actRotateRight">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/rotateright.png</normaloff>:/images/images/rotateright.png</iconset>
   </property>
   <property name="text">
    <string>右旋转</string>
   </property>
   <property name="toolTip">
    <string>右旋转</string>
   </property>
  </action>
  <action name="actRestore">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/420.bmp</normaloff>:/images/images/420.bmp</iconset>
   </property>
   <property name="text">
    <string>恢复</string>
   </property>
   <property name="toolTip">
    <string>恢复大小</string>
   </property>
  </action>
  <action name="actGroup">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/UNGROUP.BMP</normaloff>:/images/images/UNGROUP.BMP</iconset>
   </property>
   <property name="text">
    <string>组合</string>
   </property>
   <property name="toolTip">
    <string>组合</string>
   </property>
  </action>
  <action name="actGroupBreak">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/128.bmp</normaloff>:/images/images/128.bmp</iconset>
   </property>
   <property name="text">
    <string>打散</string>
   </property>
   <property name="toolTip">
    <string>取消组合</string>
   </property>
  </action>
  <action name="actItem_Circle">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/08.JPG</normaloff>:/images/images/08.JPG</iconset>
   </property>
   <property name="text">
    <string>圆形</string>
   </property>
   <property name="toolTip">
    <string>圆形</string>
   </property>
  </action>
  <action name="actItem_Triangle">
   <property name="icon">
    <iconset resource="res.qrc">
     <normaloff>:/images/images/Icon1242.ico</normaloff>:/images/images/Icon1242.ico</iconset>
   </property>
   <property name="text">
    <string>三角形</string>
   </property>
   <property name="toolTip">
    <string>三角形</string>
   </property>
  </action>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>QWGraphicsView</class>
   <extends>QGraphicsView</extends>
   <header location="global">qwgraphicsview.h</header>
  </customwidget>
 </customwidgets>
 <resources>
  <include location="res.qrc"/>
 </resources>
 <connections>
  <connection>
   <sender>actQuit</sender>
   <signal>triggered()</signal>
   <receiver>MainWindow</receiver>
   <slot>close()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>-1</x>
     <y>-1</y>
    </hint>
    <hint type="destinationlabel">
     <x>302</x>
     <y>153</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include    <QGraphicsRectItem>
#include    <QInputDialog>
#include    <QColorDialog>
#include    <QFontDialog>
#include    <QTime>
#include    <QKeyEvent>


template<class T> void setBrushColor(T *item)
{//函数模板
    QColor color=item->brush().color();
    color=QColorDialog::getColor(color,NULL,"选择填充颜色");
    if (color.isValid())
        item->setBrush(QBrush(color));
}

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("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->setDragMode(QGraphicsView::RubberBandDrag);

    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::connect(ui->View,SIGNAL(keyPress(QKeyEvent*)),
                     this, SLOT(on_keyPress(QKeyEvent*)));

    qsrand(QTime::currentTime().second());
}

MainWindow::~MainWindow()
{
    delete ui;
}

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("Scene 坐标:%.0f,%.0f",pointScene.x(),pointScene.y()));
}

void MainWindow::on_mouseClicked(QPoint point)
{//鼠标单击事件
    QPointF pointScene=ui->View->mapToScene(point); //转换到Scene坐标
    QGraphicsItem  *item=NULL;
    item=scene->itemAt(pointScene,ui->View->transform()); //获取光标下的绘图项
    if (item != NULL) //有绘图项
    {
        QPointF pointItem=item->mapFromScene(pointScene); //转换为绘图项的局部坐标
        labItemCord->setText(QString::asprintf("Item 坐标:%.0f,%.0f",pointItem.x(),pointItem.y()));
        labItemInfo->setText(item->data(ItemDesciption).toString()+", ItemId="+
                   item->data(ItemId).toString());
    }
}

void MainWindow::on_mouseDoubleClick(QPoint point)
{//鼠标双击事件,调用相应的对话框,设置填充颜色、线条颜色或字体
    QPointF pointScene=ui->View->mapToScene(point); //转换到Scene坐标
    QGraphicsItem  *item=NULL;
    item=scene->itemAt(pointScene,ui->View->transform()); //获取光标下的绘图项

    if (item == NULL) //没有绘图项
        return;

    switch (item->type())  //绘图项的类型
    {
      case    QGraphicsRectItem::Type: //矩形框
      { //强制类型转换
        QGraphicsRectItem *theItem=qgraphicsitem_cast<QGraphicsRectItem*>(item);
        setBrushColor(theItem);
        break;
      }
      case    QGraphicsEllipseItem::Type: //椭圆和圆都是 QGraphicsEllipseItem
      {
        QGraphicsEllipseItem *theItem;
        theItem=qgraphicsitem_cast<QGraphicsEllipseItem*>(item);
        setBrushColor(theItem);
        break;
      }

      case    QGraphicsPolygonItem::Type: //梯形和三角形
      {
        QGraphicsPolygonItem *theItem=qgraphicsitem_cast<QGraphicsPolygonItem*>(item);
        setBrushColor(theItem);
        break;
      }
      case    QGraphicsLineItem::Type: //直线,设置线条颜色
      {
        QGraphicsLineItem *theItem=qgraphicsitem_cast<QGraphicsLineItem*>(item);
        QPen    pen=theItem->pen();
        QColor  color=theItem->pen().color();
        color=QColorDialog::getColor(color,this,"选择线条颜色");
        if (color.isValid())
        {
            pen.setColor(color);
            theItem->setPen(pen);
        }
        break;
      }
      case    QGraphicsTextItem::Type: //文字,设置字体
      {
        QGraphicsTextItem *theItem=qgraphicsitem_cast<QGraphicsTextItem*>(item);
        QFont font=theItem->font();
        bool ok=false;
        font=QFontDialog::getFont(&ok,font,this,"设置字体");
        if (ok)
            theItem->setFont(font);
        break;
      }
    }
}

void MainWindow::on_keyPress(QKeyEvent *event)
{ //按键事件
    if (scene->selectedItems().count()!=1)
        return; //没有选中的绘图项,或选中的多于1个
    QGraphicsItem   *item=scene->selectedItems().at(0);

    if (event->key()==Qt::Key_Delete)//删除
       scene->removeItem(item);
    else if (event->key()==Qt::Key_Space) //顺时针旋转90度
       item->setRotation(90+item->rotation());
    else if (event->key()==Qt::Key_PageUp)//放大
        item->setScale(0.1+item->scale());
    else if (event->key()==Qt::Key_PageDown) //缩小
        item->setScale(-0.1+item->scale());
    else if (event->key()==Qt::Key_Left)  //左移
        item->setX(-1+item->x());
    else if (event->key()==Qt::Key_Right) //右移
        item->setX(1+item->x());
    else if (event->key()==Qt::Key_Up) //上移
        item->setY(-1+item->y());
    else if (event->key()==Qt::Key_Down) //下移
        item->setY(1+item->y());
}

void MainWindow::on_actItem_Rect_triggered()
{ //添加一个矩形
    QGraphicsRectItem   *item=new QGraphicsRectItem(-50,-25,100,50);//x,y 为左上角的图元局部坐标,图元中心点为0,0
    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::yellow));
    item->setZValue(++frontZ);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"矩形");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actItem_Ellipse_triggered()
{ //添加一个椭圆
    QGraphicsEllipseItem   *item=new QGraphicsEllipseItem(-50,-30,100,60);
    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::blue)); //填充颜色
    item->setZValue(++frontZ); //用于叠放顺序
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100)); //初始位置
    item->setData(ItemId,++seqNum);  //自定义数据,ItemId键
    item->setData(ItemDesciption,"椭圆"); //自定义数据,ItemDesciption键

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actItem_Polygon_triggered()
{ //添加一个梯形
    QGraphicsPolygonItem   *item=new QGraphicsPolygonItem;

    QPolygonF   points;
    points.append(QPointF(-40,-40));
    points.append(QPointF(40,-40));
    points.append(QPointF(100,40));
    points.append(QPointF(-100,40));
    item->setPolygon(points);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::green));
    item->setZValue(++frontZ);

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"梯形");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actEdit_Delete_triggered()
{ //删除所有选中的绘图项
    int cnt=scene->selectedItems().count();
    if (cnt>0)
    for (int i=0;i<cnt;i++)
    {
        QGraphicsItem*  item=scene->selectedItems().at(0);
        scene->removeItem(item); //删除绘图项
    }
}

void MainWindow::on_actZoomIn_triggered()
{ //放大
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItem   *item;
        item=scene->selectedItems().at(0);
        item->setScale(0.1+item->scale());
    }
    else
        ui->View->scale(1.1,1.1);
}

void MainWindow::on_actZoomOut_triggered()
{//缩小
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItem   *item;
        item=scene->selectedItems().at(0);
        item->setScale(item->scale()-0.1);
    }
    else
        ui->View->scale(0.9,0.9);
}

void MainWindow::on_actRestore_triggered()
{//取消所有变换
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItem* item=scene->selectedItems().at(0);
//        item->resetTransform();   //不起作用
        item->setRotation(0);
        item->setScale(1.0);
    }
    else
        ui->View->resetTransform();
}

void MainWindow::on_actRotateLeft_triggered()
{//逆时针旋转
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItem* item=scene->selectedItems().at(0);
        item->setRotation(-30+item->rotation());
    }
    else
        ui->View->rotate(-30);
}

void MainWindow::on_actRotateRight_triggered()
{//顺时针旋转
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItem* item=scene->selectedItems().at(0);
        item->setRotation(+30+item->rotation());
    }
    else
        ui->View->rotate(+30);
}

void MainWindow::on_actEdit_Front_triggered()
{ //bring to front,前置
    int cnt=scene->selectedItems().count();
    if (cnt>0)
    { //只处理选中的第1个绘图项
        QGraphicsItem* item=scene->selectedItems().at(0);
        item->setZValue(++frontZ);
    }
}

void MainWindow::on_actEdit_Back_triggered()
{//bring to back,后置
    int cnt=scene->selectedItems().count();
    if (cnt>0)
    {//只处理选中的第1个绘图项
        QGraphicsItem* item=scene->selectedItems().at(0);
        item->setZValue(--backZ);
    }

}

void MainWindow::on_actItem_Line_triggered()
{//添加直线
    QGraphicsLineItem   *item=new QGraphicsLineItem(-100,0,100,0);//x,y 为左上角的图元局部坐标,图元中心点为0,0
    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);

    QPen    pen(Qt::red);
    pen.setWidth(3);
    item->setPen(pen);

    item->setZValue(++frontZ);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"直线");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actItem_Text_triggered()
{ //添加文字
    QString str=QInputDialog::getText(this,"输入文字","请输入文字");
    if (str.isEmpty())
        return;

    QGraphicsTextItem   *item=new QGraphicsTextItem(str);

    QFont   font=this->font();
    font.setPointSize(20);
    font.setBold(true);
    item->setFont(font);

    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));
    item->setZValue(++frontZ);

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"文字");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actGroup_triggered()
{ //组合
    int cnt=scene->selectedItems().count();
    if (cnt>1)
    {
       QGraphicsItemGroup* group =new QGraphicsItemGroup; //创建组合
       scene->addItem(group); //组合添加到场景中

        for (int i=0;i<cnt;i++)
        {
            QGraphicsItem* item=scene->selectedItems().at(0);
            item->setSelected(false); //清除选择虚线框
            item->clearFocus();
            group->addToGroup(item); //添加到组合
        }
        group->setFlags(QGraphicsItem::ItemIsMovable
                       | QGraphicsItem::ItemIsSelectable
                       | QGraphicsItem::ItemIsFocusable);

        group->setZValue(++frontZ);
//        group->clearFocus();
        scene->clearSelection();
        group->setSelected(true);
     }
}

void MainWindow::on_actGroupBreak_triggered()
{ //break group,打散组合
    int cnt=scene->selectedItems().count();
    if (cnt==1)
    {
        QGraphicsItemGroup  *group;
        group=(QGraphicsItemGroup*)scene->selectedItems().at(0);
        scene->destroyItemGroup(group);
     }
}

void MainWindow::on_actItem_Circle_triggered()
{ //添加圆形
    QGraphicsEllipseItem   *item=new QGraphicsEllipseItem(-50,-50,100,100);
    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::cyan));
    item->setZValue(++frontZ);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"圆形");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}

void MainWindow::on_actItem_Triangle_triggered()
{ //添加三角形
    QGraphicsPolygonItem   *item=new QGraphicsPolygonItem;
    QPolygonF   points;
    points.append(QPointF(0,-40));
    points.append(QPointF(60,40));
    points.append(QPointF(-60,40));
    item->setPolygon(points);
    item->setPos(-50+(qrand() % 100),-50+(qrand() % 100));

    item->setFlags(QGraphicsItem::ItemIsMovable
                   | QGraphicsItem::ItemIsSelectable
                   | QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::magenta));
    item->setZValue(++frontZ);

    item->setData(ItemId,++seqNum);
    item->setData(ItemDesciption,"三角形");

    scene->addItem(item);
    scene->clearSelection();
    item->setSelected(true);
}


qwgraphicsview.h

#ifndef QWGRAPHICSVIEW_H
#define QWGRAPHICSVIEW_H

#include <QObject>
#include <QGraphicsView>
#include "qwgraphicsview.h"

class QWGraphicsView : public QGraphicsView
{
    Q_OBJECT

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
public:
    QWGraphicsView(QWidget *parent = 0);

signals:
    void mouseMovePoint(QPoint point); //鼠标移动
    void mouseClicked(QPoint point); //鼠标单击
    void mouseDoubleClick(QPoint point); //双击事件
    void keyPress(QKeyEvent *event); //按键事件

};

#endif // QWGRAPHICSVIEW_H

qwgraphicsview.cpp

#include "qwgraphicsview.h"
#include    <QMouseEvent>
#include    <QPoint>

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);
}

QWGraphicsView::QWGraphicsView(QWidget *parent):QGraphicsView(parent)
{

}

源码:https://download.csdn.net/download/qq_30457077/85075848

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值