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