一、创建绘图软件项目
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);
}