Qt(十二)Graphics View 绘图软件(二)

一、创建绘图软件项目

UI设计与布局 ,工具栏设置,基于QGraphicsView类的提升 操作方法
在这里插入图片描述

二、代码

class mainwindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QGraphicsPolygonItem>
#include <QGraphicsEllipseItem>
#include <QGraphicsTextItem>
#include <QInputDialog>
#include <QColorDialog>
#include <QGraphicsItemGroup>
#include <QTime>
#include <QKeyEvent>
#include "mygraphicsview.h"


QT_BEGIN_NAMESPACE
namespace Ui {
    
     class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

private:
    QLabel* labItemInfo;
    QGraphicsScene* scene;
    static const int ItemId = 1;
    static const int ItemDesc = 2;
    int seqNum = 0;

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;


private slots:
    void on_keyPress(QKeyEvent *event);
    void on_mouseDoubleClick(QPoint point);
    void on_mouseClicked(QPoint point);
    void on_actRect_triggered();
    void on_actCircle_triggered();
    void on_actEllipses_triggered();
    void on_actLine_triggered();
    void on_actPolygon_triggered();
    void on_actTriangle_triggered();
    void on_actText_triggered();
    void on_actZoomIn_triggered();
    void on_actZoomOut_triggered();
    void on_actResotre_triggered();
    void on_actLeftRotate_triggered();
    void on_actRightRotate_triggered();
    void on_actFront_triggered();
    void on_actBack_triggered();
    void on_actCombine_triggered();
    void on_actUncombine_triggered();
    void on_actDelete_triggered();
};
#endif // MAINWINDOW_H

mainwindow.cpp

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


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    
    
    ui->setupUi(this);
    labItemInfo = new QLabel("ItemInfo: ");
    labItemInfo->setMinimumWidth(150);
    scene = new QGraphicsScene(-300,-200,600,400);
    ui->gView->setScene(scene);
    ui->gView->setCursor(Qt::CrossCursor);
    ui->gView->setMouseTracking(true);
    ui->gView->setDragMode(QGraphicsView::RubberBandDrag); //框选

    ui->statusbar->addWidget(labItemInfo);
    connect(ui->gView,SIGNAL(keyPress(QKeyEvent *)),this,SLOT(on_keyPress(QKeyEvent*)));
    connect(ui->gView,SIGNAL(mouseDoubleClick(QPoint)),this,SLOT(on_mouseDoubleClick(QPoint)));
    connect(ui->gView,SIGNAL(mouseClicked(QPoint)),this,SLOT(on_mouseClicked(QPoint)));

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



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

// 键盘事件
void MainWindow::on_keyPress(QKeyEvent *event)
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    switch (event->key()) {
    
    
    case Qt::Key_Delete:{
    
    
        for (int i=0;i<cnt;i++) {
    
    
            QGraphicsItem* item = scene->selectedItems().at(0);
            scene->removeItem(item);
        }
        break;
    }
    case Qt::Key_Up:{
    
    
        for (int i=0;i<cnt;i++) {
    
    
            QGraphicsItem* item = scene->selectedItems().at(i);
            item->setY(item->y()-1);
        }
        break;
    }
    case Qt::Key_Down:{
    
    
        for (int i=0;i<cnt;i++) {
    
    
            QGraphicsItem* item = scene->selectedItems().at(i);
            item->setY(item->y()+1);
        }
        break;
    }
    case Qt::Key_Left:{
    
    
        for (int i=0;i<cnt;i++) {
    
    
            QGraphicsItem* item = scene->selectedItems().at(i);
            item->setX(item->x()-1);
        }
        break;
    }
    case Qt::Key_Right:{
    
    
        for (int i=0;i<cnt;i++) {
    
    
            QGraphicsItem* item = scene->selectedItems().at(i);
            item->setX(item->x()+1);
        }
        break;
    }
   }
}

// 鼠标双击事件
void MainWindow::on_mouseDoubleClick(QPoint point)
{
    
    
    QPointF pointScene = ui->gView->mapToScene(point);
    QGraphicsItem* item = NULL;
    item = scene->itemAt(pointScene,ui->gView->transform());
    if(item==NULL) return;
    switch (item->type()) {
    
    
    case QGraphicsRectItem::Type:{
    
    
        QGraphicsRectItem* theItem;
        theItem = qgraphicsitem_cast<QGraphicsRectItem*>(item);
        QColor color = theItem->brush().color();
        color = QColorDialog::getColor(color,NULL,"select color");
        if(color.isValid())
            theItem->setBrush(QBrush(color));
        break;
    }
    case QGraphicsEllipseItem::Type:{
    
    
        QGraphicsEllipseItem* theItem;
        theItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item);
        QColor color = theItem->brush().color();
        color = QColorDialog::getColor(color,NULL,"select color");
        if(color.isValid())
            theItem->setBrush(QBrush(color));
        break;
    }
    case QGraphicsPolygonItem::Type:{
    
    
        QGraphicsPolygonItem* theItem;
        theItem = qgraphicsitem_cast<QGraphicsPolygonItem*>(item);
        QColor color = theItem->brush().color();
        color = QColorDialog::getColor(color,NULL,"select color");
        if(color.isValid())
            theItem->setBrush(QBrush(color));
        break;
    }
    case QGraphicsLineItem::Type:{
    
    
        QGraphicsLineItem* theItem;
        theItem = qgraphicsitem_cast<QGraphicsLineItem*>(item);
        QColor color = theItem->pen().color();
        color = QColorDialog::getColor(color,NULL,"select color");
        if(color.isValid())
            theItem->setPen(QPen(color));
        break;
    }
    case QGraphicsTextItem::Type:
        QGraphicsTextItem* theItem;
        theItem = qgraphicsitem_cast<QGraphicsTextItem*>(item);
        QColor color = theItem->defaultTextColor();
        color = QColorDialog::getColor(color,NULL,"select color");
        theItem->setDefaultTextColor(color);
        break;
    }
}

void MainWindow::on_mouseClicked(QPoint point)
{
    
    
    QPointF pointScene = ui->gView->mapToScene(point);
    QGraphicsItem* item = NULL;
    item = scene->itemAt(pointScene,ui->gView->transform());
    if(item!=NULL){
    
    
        labItemInfo->setText("ItemInfo: " + item->data(ItemId).toString()+", "+item->data(ItemDesc).toString());
    }
}




void MainWindow::on_actRect_triggered()
{
    
    
    QGraphicsRectItem* item  = new QGraphicsRectItem(-50,-30,100,60);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    item->setBrush(QBrush(Qt::yellow));
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"矩形");

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

}

void MainWindow::on_actCircle_triggered()
{
    
    
    QGraphicsEllipseItem* item  = new QGraphicsEllipseItem(-50,-50,100,100);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    item->setBrush(QBrush(Qt::red));
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"圆形");

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

void MainWindow::on_actEllipses_triggered()
{
    
    
    QGraphicsEllipseItem* item  = new QGraphicsEllipseItem(-50,-30,100,60);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    item->setBrush(QBrush(Qt::cyan));
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"椭圆");

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

void MainWindow::on_actLine_triggered()
{
    
    
    QGraphicsLineItem* item  = new QGraphicsLineItem(-100,0,100,0);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    QPen pen;
    pen.setColor(Qt::black);
    pen.setWidth(4);
    item->setPen(pen);
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"直线");

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

void MainWindow::on_actPolygon_triggered()
{
    
    
    QGraphicsPolygonItem* item  = new QGraphicsPolygonItem;
    QPolygonF points;
    points.append(QPointF(-40,-40));
    points.append(QPointF( 40,-40));
    points.append(QPointF( 60, 40));
    points.append(QPointF(-60, 40));

    item->setPolygon(points);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    item->setBrush(QBrush(Qt::magenta));
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"梯形");

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

void MainWindow::on_actTriangle_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->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    item->setBrush(QBrush(Qt::darkCyan));
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"三角形");

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

void MainWindow::on_actText_triggered()
{
    
    
    QString str = QInputDialog::getText(this,"Input","Input Text");
    QGraphicsTextItem* item  = new QGraphicsTextItem(str);
    item->setFlags(QGraphicsItem::ItemIsFocusable|QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    QFont font;
    font.setPointSize(20);
    item->setDefaultTextColor(Qt::black);
    item->setFont(font);
    item->setPos(-100+qrand()%200,-60+qrand()%100);
    item->setData(ItemId,++seqNum);
    item->setData(ItemDesc,"字体");

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

void MainWindow::on_actZoomIn_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0){
    
    
        ui->gView->scale(1.1,1.1);
        return;
    }
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setScale(0.1+item->scale());
    }
}

void MainWindow::on_actZoomOut_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0){
    
    
        ui->gView->scale(0.9,0.9);
        return;
    }
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setScale(-0.1+item->scale());
    }
}

void MainWindow::on_actResotre_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0){
    
    
        ui->gView->resetTransform();
        return;
    }
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setScale(1);
    }
}

void MainWindow::on_actLeftRotate_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setRotation(item->rotation()-22.5);
    }
}

void MainWindow::on_actRightRotate_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setRotation(item->rotation()+22.5);
    }
}

void MainWindow::on_actFront_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setZValue(item->zValue()+1);
    }
}

void MainWindow::on_actBack_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        item->setZValue(item->zValue()-1);
    }
}

void MainWindow::on_actCombine_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt<2) return;

    QGraphicsItemGroup* group = new QGraphicsItemGroup;
    scene->addItem(group);
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(0);
        item->setSelected(false);
        group->addToGroup(item);
    }
    group->setFlags(QGraphicsItem::ItemIsFocusable|
                    QGraphicsItem::ItemIsSelectable|
                    QGraphicsItem::ItemIsMovable);
    scene->clearSelection();
    group->setSelected(true);
}

void MainWindow::on_actUncombine_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;

    QList<QGraphicsItemGroup*> list;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(i);
        if(item->type() == QGraphicsItemGroup::Type){
    
    
            QGraphicsItemGroup* group =qgraphicsitem_cast<QGraphicsItemGroup*>(item);
            list.append(group);
        }
    }
    foreach(auto gItem, list){
    
    
        scene->destroyItemGroup(gItem);
    }
}

void MainWindow::on_actDelete_triggered()
{
    
    
    int cnt = scene->selectedItems().count();
    if(cnt==0) return;
    for (int i=0;i<cnt;i++) {
    
    
        QGraphicsItem* item = scene->selectedItems().at(0);
        scene->removeItem(item);
    }
}

class mygraphicsview

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H

#include <QWidget>
#include <QGraphicsView>
#include <QPoint>
#include <QMouseEvent>

class MyGraphicsView : public QGraphicsView
{
    
    
    Q_OBJECT
public:
    explicit MyGraphicsView(QWidget *parent = nullptr);


protected:
    void keyPressEvent(QKeyEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;

signals:
    void keyPress(QKeyEvent *event);
    void mouseDoubleClick(QPoint point);
    void mouseClicked(QPoint point);

};

#endif // MYGRAPHICSVIEW_H

mygraphicsview.cpp

#include "mygraphicsview.h"

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

}

void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{
    
    
    emit keyPress(event);
    QGraphicsView::keyPressEvent(event);
}

void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
{
    
    
    if(event->button() == Qt::LeftButton){
    
    
        QPoint point = event->pos();
        emit mouseDoubleClick(point);
    }
    QGraphicsView::mouseDoubleClickEvent(event);
}

void MyGraphicsView::mousePressEvent(QMouseEvent *event)
{
    
    
    if(event->button() == Qt::LeftButton){
    
    
        QPoint point = event->pos();
        emit mouseClicked(point);
    }
    QGraphicsView::mousePressEvent(event);
}

三、效果演示

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/123522138