#include "arrow.h"
#include "diagramitem.h"
#include "diagramtextitem.h"
#include "diagramscene.h"
#include "mainwindow.h"
#include "commands.h"
#include "ui_mainwindow.h"
#include <QtWidgets>
#include <qmap.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
undoStack = new QUndoStack(this);
undoStack->setUndoLimit( 5 );
// createUndoView();
createToolBox();
connect(ui->backgroundButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)),this, SLOT(backgroundButtonGroupClicked(QAbstractButton*)));
//初始化场景
scene = new DiagramScene( ui->menuItem , this);
scene->setSceneRect(QRectF(0, 0, 1920, 1080));
connect(scene, SIGNAL(itemInserted(DiagramItem*)), this, SLOT(itemInserted(DiagramItem*)));
connect(scene, SIGNAL(itemMoved(DiagramItem*,QPointF)),this, SLOT(itemMoved(DiagramItem*,QPointF)));
createToolbars();
//关联视图场景
ui->view->setScene( scene );
setUnifiedTitleAndToolBarOnMac(true);
}
/**
* @brief MainWindow::createUndoView
* 创建撤销窗口,未使用
*/
void MainWindow::createUndoView()
{
undoView = new QUndoView(undoStack);
undoView->setWindowTitle(tr("Command List"));
undoView->setWindowFlags(undoView->windowFlags() | Qt::WindowStaysOnTopHint);
undoView->raise();
undoView->show();
undoView->setAttribute(Qt::WA_QuitOnClose, false);
}
/**
* @brief MainWindow::backgroundButtonGroupClicked
* 关联背景按钮
* @param button
*/
void MainWindow::backgroundButtonGroupClicked(QAbstractButton *button)
{
QList<QAbstractButton *> buttons = ui->backgroundButtonGroup->buttons();
foreach (QAbstractButton *myButton, buttons) {
if (myButton != button)
button->setChecked(false);
}
QString text = button->text();
if (text == tr("Blue Grid"))
scene->setBackgroundBrush(QPixmap(":/images/background1.png"));
else if (text == tr("White Grid"))
scene->setBackgroundBrush(QPixmap(":/images/background2.png"));
else if (text == tr("Gray Grid"))
scene->setBackgroundBrush(QPixmap(":/images/background3.png"));
else
scene->setBackgroundBrush(QPixmap(":/images/background4.png"));
scene->update();
ui->view->update();
}
void MainWindow::itemMoved(DiagramItem *movedItem,
const QPointF &oldPosition)
{
undoStack->push(new MoveCommand(movedItem, oldPosition));
}
/**
* @brief MainWindow::buttonGroupClicked
* 响应元件按钮功能, 在场景中插入元件item
* @param id
*/
void MainWindow::buttonGroupClicked(int id)
{
QList<QAbstractButton *> buttons = buttonGroup->buttons();
foreach (QAbstractButton *button, buttons) {
if (buttonGroup->button(id) != button)
button->setChecked(false);
}
scene->setItemType(DiagramItem::DiagramType(id));
if (DiagramItem::DiagramType(id) == DiagramItem::Text) {
scene->setMode(DiagramScene::InsertText);
}
else {
scene->setMode(DiagramScene::InsertItem);
}
}
/**
* @brief MainWindow::on_deleteAction_triggered
* 删除元件item动作
*/
void MainWindow::on_deleteAction_triggered()
{
deleteItem();
}
void MainWindow::deleteItem()
{
QUndoCommand *deleteCommand = new DeleteCommand(scene);
undoStack->push(deleteCommand);
scene->update();
}
/**
* @brief MainWindow::pointerGroupClicked
* 设置绘制元件类型
*/
void MainWindow::pointerGroupClicked(int)
{
scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
}
/**
* @brief MainWindow::on_toFrontAction_triggered
* 响应前置动作
*/
void MainWindow::on_toFrontAction_triggered()
{
if (scene->selectedItems().isEmpty())
return;
QGraphicsItem *selectedItem = scene->selectedItems().first();
QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
qreal zValue = 0;
foreach (QGraphicsItem *item, overlapItems) {
if (item->zValue() >= zValue && item->type() == DiagramItem::Type)
zValue = item->zValue() + 0.1;
}
selectedItem->setZValue(zValue);
}
/**
* @brief MainWindow::on_sendBackAction_triggered
* 响应后置动作
*/
void MainWindow::on_sendBackAction_triggered()
{
if (scene->selectedItems().isEmpty())
return;
QGraphicsItem *selectedItem = scene->selectedItems().first();
QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
qreal zValue = 0;
foreach (QGraphicsItem *item, overlapItems) {
if (item->zValue() <= zValue && item->type() == DiagramItem::Type)
zValue = item->zValue() - 0.1;
}
selectedItem->setZValue(zValue);
}
/**
* @brief MainWindow::itemInserted
* 对插入元件item,作出关联,command, 实现撤销恢复功能
* @param item
*/
void MainWindow::itemInserted(DiagramItem *item)
{
pointerTypeGroup->button(int(DiagramScene::MoveItem))->setChecked(true);
scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
buttonGroup->button(int(item->diagramType()))->setChecked(false);
// add item
QUndoCommand *addCommand = new AddCommand(item, scene);
undoStack->push(addCommand);
}
/**
* @brief MainWindow::on_actRotateLeft_triggered
* 实现向左旋转90
*/
void MainWindow::on_actRotateLeft_triggered()
{
if (scene->selectedItems().isEmpty())
return;
QGraphicsItem *selectedItem = scene->selectedItems().first();
if( selectedItem->type()==QGraphicsItemGroup::Type ) return;
selectedItem->setRotation(-90+selectedItem->rotation());
scene->update();
}
/**
* @brief MainWindow::on_actRotateRight_triggered
* 实现向右旋转90
*/
void MainWindow::on_actRotateRight_triggered()
{
if (scene->selectedItems().isEmpty())
return;
QGraphicsItem *selectedItem = scene->selectedItems().first();
if( selectedItem->type()==QGraphicsItemGroup::Type ) return;
selectedItem->setRotation(90+selectedItem->rotation());
scene->update();
}
/**
* @brief MainWindow::sceneScaleChanged
* 响应视图缩放功能
* @param scale
*/
void MainWindow::sceneScaleChanged(const QString &scale)
{
double newScale = scale.left(scale.indexOf(tr("%"))).toDouble() / 100.0;
QMatrix oldMatrix = ui->view->matrix();
ui->view->resetMatrix();
ui->view->translate(oldMatrix.dx(), oldMatrix.dy());
ui->view->scale(newScale, newScale);
}
/**
* @brief MainWindow::on_aboutAction_triggered
* 显示关于对话框
*/
void MainWindow::on_aboutAction_triggered()
{
QMessageBox::about(this, tr("About Diagram Scene"),
tr("The <b>Diagram Scene</b> example shows "
"use of the graphics framework."));
}
/**
* @brief MainWindow::on_lineEdit_textChanged
* 实现图元搜索功能
* @param arg1
*/
void MainWindow::on_lineEdit_textChanged(const QString &arg1)
{
auto keys = map_name_widget.keys();
foreach( auto key, keys ){
if( key.contains( arg1, Qt::CaseInsensitive ) ){
map_name_widget.value(key)->show();
}
else
map_name_widget.value(key)->hide();
if( arg1.isEmpty() )
map_name_widget.value(key)->show();
}
QGridLayout *layout = ui->gridLayout_2;
int r = 1;
int c = 0;
foreach( auto w, map_name_widget.values() ){
if( w->isHidden() )
layout->removeWidget( w );
else{
layout->addWidget( w, r, c );
if( ++c>=2 ){
c=0;
++r;
}
}
}
}
/**
* @brief MainWindow::createToolBox
* 创建左侧工具栏
*/
void MainWindow::createToolBox()
{
buttonGroup = new QButtonGrou
没有合适的资源?快使用搜索试试~ 我知道了~
基于Qt实现的电路图编辑程序
共46个文件
png:26个
cpp:8个
h:7个
2 下载量 141 浏览量
2024-05-08
23:22:43
上传
评论
收藏 43KB ZIP 举报
温馨提示
1. 自定义元件 2. 实现电路图的导入,导出功能 3. 实现绘制动作的撤销,恢复功能 4. 实现元件的搜索功能 5. 实现元件的连接及动态连接 6. 实现元件的右键功能
资源推荐
资源详情
资源评论
收起资源包目录
diagramscene.zip (46个子文件)
mainwindow.h 2KB
diagramtextitem.cpp 1KB
graphicsdragview.cpp 3KB
circuitdiagramscene.pro 462B
arrow.cpp 2KB
mainwindow.cpp 17KB
diagramitem.h 2KB
diagramitem.cpp 5KB
main.cpp 316B
mainwindow.ui 17KB
arrow.h 1KB
commands.h 1KB
bin
1.ini 561B
2.ini 3KB
diagramscene.cpp 6KB
graphicsdragview.h 489B
commands.cpp 4KB
images
ungroup.png 257B
zoomin.png 2KB
background2.png 114B
undo.png 962B
rotateright.png 2KB
bringtofront.png 293B
pointer.png 230B
redo.png 985B
textpointer.png 893B
background1.png 112B
underline.png 307B
linepointer.png 141B
but-quit.png 2KB
open.png 2KB
linecolor.png 145B
italic.png 299B
group.png 225B
delete.png 831B
background4.png 96B
save.png 2KB
rotateleft.png 2KB
bold.png 353B
background3.png 116B
zoomout.png 2KB
sendtoback.png 318B
floodfill.png 282B
diagramscene.h 1KB
diagramscene.qrc 1KB
diagramtextitem.h 841B
共 46 条
- 1
资源评论
北方有佳人,绝世而独立
- 粉丝: 22
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功