ПРИЛОЖЕНИЕ 1 КОНТРОЛЬНЫЙ ПРИМЕР
В данном приложении расположены снимки экранных форм системы.
Главное окно программы
Рис. П.1.1 Окно редактирования помещения
Рис. П.1.2
Окно редактирование двери
Рис. П.1.3 Работа с текстом
Рис. П.1.4
Меню «Файл»
Рис. П.1.5 Меню «Обзор»
Рис. П.1.6
Меню «Обзор»
Рис. П.1.7
Контекстное меню
Рис. П.1.8
ПРИЛОЖЕНИЕ 2 КОД ПРОГРАММЫ
Файл mainwindow.cpp
#include #include "mainwindow.h"
#include "character/mwcharacter.h"
const int InsertTextButton = 10;
const int InsertDrawItemButton = 64;
const int InsertPathButton = 20;
const int InsertWallButton = 30;
const int InsertLineToolButton = 40; #define NDEBUG MainWindow::MainWindow()
{
createActions();
createToolBox();
createMenus(); scene = new DiagramScene(itemMenu); //myGrid = 20;
widthScene = 1000;
heightScene = 1000;
//scene->setGrid(myGrid);
scene->setSceneRect(0, 0, widthScene, heightScene); connect(scene, SIGNAL(itemInserted(DiagramDrawItem *)),
this, SLOT(itemInserted(DiagramDrawItem *)));
connect(scene, SIGNAL(textInserted(QGraphicsTextItem *)),
this, SLOT(textInserted(QGraphicsTextItem *)));
connect(scene, SIGNAL(itemSelected(QGraphicsItem *)),
this, SLOT(itemSelected(QGraphicsItem *))); // activate/deactivate shortcuts when text is edited in scene
connect(scene, SIGNAL(editorHasReceivedFocus()),
this, SLOT(deactivateShortcuts()));
connect(scene, SIGNAL(editorHasLostFocus()),
this, SLOT(activateShortcuts()));
connect(scene, SIGNAL(zoomRect(QPointF,QPointF)),
this, SLOT(doZoomRect(QPointF,QPointF)));
connect(scene, SIGNAL(zoom(const qreal)),
this, SLOT(zoom(const qreal)));
createToolbars();
tabWidget = new QTabWidget;
view = new QGraphicsView(scene);
view->setRenderHint(QPainter::Antialiasing, true);
view->setDragMode(QGraphicsView::RubberBandDrag);
view->setCacheMode(QGraphicsView::CacheBackground); listScene.append(scene);
listView.append(view); QVBoxLayout *layoutTool = new QVBoxLayout;
layoutTool->addWidget(toolBox);
QWidget *widgetTool = new QWidget;
widgetTool->setLayout(layoutTool);
QGridLayout *layoutTab = new QGridLayout;
layoutTab->addWidget(view);
QWidget *widgetTab = new QWidget;
widgetTab->setLayout(layoutTab); tabWidget->addTab(widgetTab, tr(mwTabWidget)); QGridLayout *layout = new QGridLayout;
layout->addWidget(widgetTool, 0, 0);
layout->addWidget(tabWidget, 0 , 1);
setLayout(layout); QWidget *widget = new QWidget;
widget->setLayout(layout); setCentralWidget(widget); setWindowTitle(tr(mwWinTitle));
toggleGrid(false);
myFileName.clear(); myShowGrid = false;
} void MainWindow::deleteItem()
{
scene = listScene.at(tabWidget->currentIndex());
foreach (QGraphicsItem *item, scene->selectedItems()) {
scene->removeItem(item);
}
} void MainWindow::pointerGroupClicked(int id)
{
view = listView.at(tabWidget->currentIndex());
scene = listScene.at(tabWidget->currentIndex()); QList buttons = pointerTypeGroup->buttons(); foreach (QAbstractButton *button, buttons) {
if (pointerTypeGroup->button(id) != button)
button->setChecked(false);
}
if(pointerTypeGroup->checkedId() != DiagramScene::MoveItem)
view->setDragMode(QGraphicsView::NoDrag);
else
view->setDragMode(QGraphicsView::RubberBandDrag);
scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
} void MainWindow::bringToFront() {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItem *selectedItem = scene->selectedItems().first();
QList overlapItems = selectedItem->collidingItems(); qreal zValue = 0;
foreach (QGraphicsItem *item, overlapItems) {
if (item->zValue() >= zValue)
zValue = item->zValue() + 0.1;
}
selectedItem->setZValue(zValue);
}
} void MainWindow::sendToBack() {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItem *selectedItem = scene->selectedItems().first();
QList overlapItems = selectedItem->collidingItems(); qreal zValue = 0;
foreach (QGraphicsItem *item, overlapItems) {
if (item->zValue() <= zValue)
zValue = item->zValue() - 0.1;
}
selectedItem->setZValue(zValue);
}
} void MainWindow::rotateRight() {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItem *selectedItem = scene->selectedItems().first();
selectedItem->rotate(90);
}
} void MainWindow::rotateLeft() {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItem *selectedItem = scene->selectedItems().first();
selectedItem->rotate(-90);
}
} void MainWindow::rotateItem(int i) {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItem *selectedItem = scene->selectedItems().first();
selectedItem->rotate(i);
}
} void MainWindow::moveItems() {
scene->setMode(DiagramScene::MoveItems);
view->setDragMode(QGraphicsView::RubberBandDrag);
} void MainWindow::abort() {
scene->abort();
scene->setMode(DiagramScene::MoveItem);
view->setDragMode(QGraphicsView::RubberBandDrag);
} void MainWindow::copyItems() {
scene->setMode(DiagramScene::CopyItem);
view->setDragMode(QGraphicsView::RubberBandDrag);
} void MainWindow::groupItems() {
if (scene->selectedItems().isEmpty())
return;
else {
QGraphicsItemGroup *group = scene->createItemGroup(scene->selectedItems());
group->setFlag(QGraphicsItem::ItemIsMovable, true);
group->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
} void MainWindow::ungroupItems() {
if (scene->selectedItems().isEmpty())
return;
else {
foreach (QGraphicsItem *item, scene->selectedItems()) {
if (item->type() == 10) {
QGraphicsItemGroup *group = (QGraphicsItemGroup*) item;
scene->destroyItemGroup(group);
}
}
}
} void MainWindow::textInserted(QGraphicsTextItem *) {
buttonGroup->button(InsertTextButton)->setChecked(false);
scene->setMode(DiagramScene::MoveItem);
view->setDragMode(QGraphicsView::RubberBandDrag);
pointerTypeGroup->button(DiagramScene::MoveItem)->setChecked(true);
} void MainWindow::print() {
//scene = listScene.at(tabWidget->currentIndex());!!!
QPrinter printer;
if (QPrintDialog(&printer).exec() == QDialog::Accepted) {
QPainter painter(&printer);
painter.setRenderHint(QPainter::Antialiasing);
scene->render(&painter);
}
} void MainWindow::exportImage() {
QFileDialog::Options options;
options = 0;
QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName(this,
tr(mwExportImage),
".png",
tr("Png (*.png);;Pdf (*.pdf)"),
&selectedFilter,
options);
if (!fileName.isEmpty()){
if((selectedFilter == "Pdf (*.pdf)")) {
QRectF rect = scene->itemsBoundingRect(); QPrinter printer;
printer.setOutputFileName(fileName);
QSizeF size = printer.paperSize(QPrinter::Millimeter);
size.setHeight(size.width()*rect.height()/rect.width());
printer.setPaperSize(size,QPrinter::Millimeter);
printer.setPageMargins(0,0,0,0,QPrinter::Millimeter);
QPainter painter(&printer);// generate PDF
painter.setRenderHint(QPainter::Antialiasing);
scene->render(&painter, QRectF(), rect);
}
else {
QPixmap pixmap(1000,1000);
pixmap.fill();
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QRectF rect=scene->itemsBoundingRect();
scene->render(&painter, QRectF(), rect);
painter.end(); pixmap.save(fileName);
}
}
} void MainWindow::createToolBox() {
buttonGroup = new QButtonGroup;
buttonGroup->setExclusive(false);
connect(buttonGroup, SIGNAL(buttonClicked(int)),
this, SLOT(buttonGroupClicked(int)));
QGridLayout *layout = new QGridLayout;
layout->addWidget(createCellWidget(tr(mwLblPortal),
DiagramDrawItem::Portal), 0, 1);
layout->addWidget(createCellWidget(tr(mwLblLift),
DiagramDrawItem::Lift), 1, 0);
layout->addWidget(createCellWidget(tr(mwLblRoom),
DiagramDrawItem::Room), 1, 1);
layout->addWidget(createCellWidget(tr(mwLblWall),
DiagramDrawItem::Wall), 2, 0);
layout->addWidget(createCellWidget(tr(mwLblWindow),
DiagramDrawItem::Window), 2, 1);
layout->addWidget(createCellWidget(tr(mwLblStairway),
DiagramDrawItem::Stairway), 3, 0);
layout->addWidget(createCellWidget(tr(mwLblDoor),
DiagramDrawItem::Door), 4, 1);
QToolButton *textButton = new QToolButton;
textButton->setCheckable(true);
buttonGroup->addButton(textButton, InsertTextButton);
textButton->setIcon(QIcon(QPixmap(":/Resources/textpointer.png")
.scaled(30, 30)));
textButton->setIconSize(QSize(30, 30));
QGridLayout *textLayout = new QGridLayout;
textLayout->addWidget(textButton, 0, 0, Qt::AlignHCenter);
textLayout->addWidget(new QLabel(tr(mwLblText)), 1, 0, Qt::AlignCenter);
QWidget *textWidget = new QWidget;
textWidget->setLayout(textLayout);
layout->addWidget(textWidget, 0, 0); QToolButton *pathButton = new QToolButton;
pathButton->setCheckable(true);
buttonGroup->addButton(pathButton, InsertPathButton);
pathButton->setIcon(QIcon(QPixmap(":/Resources/linecolor.png")
.scaled(30, 30)));
pathButton->setIconSize(QSize(30, 30));
QGridLayout *pathLayout = new QGridLayout;
pathLayout->addWidget(pathButton, 0, 0, Qt::AlignHCenter);
pathLayout->addWidget(new QLabel(tr(mwLblPath)), 1, 0, Qt::AlignCenter);
QWidget *pathWidget = new QWidget;
pathWidget->setLayout(pathLayout);
layout->addWidget(pathWidget, 3, 1); QToolButton *lineButton = new QToolButton;
lineButton->setCheckable(true);
buttonGroup->addButton(lineButton, InsertLineToolButton);
lineButton->setIcon(QIcon(QPixmap(":/Resources/linecolor.png")
.scaled(30, 30)));
lineButton->setIconSize(QSize(30, 30)); QGridLayout *lineLayout = new QGridLayout;
lineLayout->addWidget(lineButton, 0, 0, Qt::AlignHCenter);
lineLayout->addWidget(new QLabel(tr(mwLblLine)), 1, 0, Qt::AlignCenter);
QWidget *lineWidget = new QWidget;
lineWidget->setLayout(lineLayout);
layout->addWidget(lineWidget, 4, 0); layout->setRowStretch(3, 10);
layout->setColumnStretch(2, 10); QWidget *itemWidget = new QWidget;
itemWidget->setLayout(layout); backgroundButtonGroup = new QButtonGroup;
connect(backgroundButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)),
this, SLOT(layerButtonGroupClicked(QAbstractButton *))); QGridLayout *backgroundLayout = new QGridLayout;
backgroundLayout->addWidget(createLayerCellWidget()); backgroundLayout->setRowStretch(2, 10);
backgroundLayout->setColumnStretch(2, 10); QWidget *backgroundWidget = new QWidget;
backgroundWidget->setLayout(backgroundLayout); backgroundLayout->setRowStretch(2, 10);
backgroundLayout->setColumnStretch(2, 10); QGridLayout *propertyLayout = new QGridLayout;
propertyLayout->addWidget(createPropertyCellWidget()); propertyLayout->setRowStretch(2, 10);
propertyLayout->setColumnStretch(2, 10); QWidget *propertyWidget = new QWidget;
propertyWidget->setLayout(propertyLayout); toolBox = new QToolBox;
toolBox->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Ignored));
toolBox->setMinimumWidth(itemWidget->sizeHint().width());
toolBox->addItem(itemWidget, tr(mwWidgetInstrumets));
toolBox->addItem(backgroundWidget, tr(mwWidgetLayer));
toolBox->addItem(propertyWidget, tr(mwWidgetProperty));
}
void MainWindow::slotAddLayer() {
DiagramScene *newScene = new DiagramScene(itemMenu); newScene->setSceneRect(0, 0, 1000, 1000);
toggleGrid(false);
myShowGrid = false; QGraphicsView *view = new QGraphicsView(newScene);
view->setDragMode(QGraphicsView::RubberBandDrag);
view->setCacheMode(QGraphicsView::CacheBackground);
view->setRenderHint(QPainter::Antialiasing, true); listScene.append(newScene);
listView.append(view);
scene->lstLayer.append(tabWidget->count()+1); QGridLayout *layoutTab = new QGridLayout;
layoutTab->addWidget(view);
QWidget *widgetTab = new QWidget;
widgetTab->setLayout(layoutTab); foreach(QGraphicsItem *item, scene->items()) {
dItem = (DiagramDrawItem *)item;
if(dItem->diagramType() == 5) { //Stairway
DiagramDrawItem *newItem = new DiagramDrawItem(dItem->diagramType(), itemMenu);
newItem->setEnabled(false);
newScene->addItem(newItem);
newScene->setPropertyStairway(newItem, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
newItem->setPos(dItem->scenePos());
newItem->setDimension(dItem->getDimension());
newItem->setZValue(dItem->zValue());
newItem->setSelected(false);
}
if(dItem->diagramType() == 4) { //Lift
DiagramDrawItem *newItem = new DiagramDrawItem(dItem->diagramType(), itemMenu);
newItem->setEnabled(false);
newScene->addItem(newItem);
newScene->setPropertyStairway(dItem, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
newItem->setPos(dItem->scenePos());
newItem->setDimension(dItem->getDimension());
newItem->setZValue(dItem->zValue());
newItem->setSelected(false);
}
}
tabWidget->addTab(widgetTab, tr(mwWidgetTitleLayer) .arg(tabWidget->count()));
} void MainWindow::slotDeleteLayer() {
if(tabWidget->count() > 1) {
tabWidget->removeTab(tabWidget->currentIndex());
listView.removeAt(tabWidget->currentIndex());
listScene.removeAt(tabWidget->currentIndex());
}
} void MainWindow::slotProperty() {
scene = listScene.at(tabWidget->currentIndex());
LineProperty *lp = new LineProperty(this, lt); if(!scene->selectedItems().isEmpty()) {
QGraphicsItem *item = scene->selectedItems().first();
switch(item->type()) {
case QGraphicsItem::UserType + 9:
lp->spinMeter->setValue(lt->l);
lt = (LineTool*)item;
foreach(QPointF p, lt->myPoints) {
if(lt->myPoints.indexOf(p) == 0) {
x1 = p.x(); y1 = p.y();
}
else if(lt->myPoints.indexOf(p) == 1) {
x2 = p.x(); y2 = p.y();
}
}
lt->pointList(item->x(), item->y(), x1, y1, x2, y2);
lp->exec();
break; case QGraphicsItem::UserType+16:
foreach(QGraphicsItem *item, scene->items()){
if(scene->selectedItems().at(0) == item) {
dItem = (DiagramDrawItem*)item;
///////////////////////////Door/////////////////////////////
if(dItem->diagramType() == 0) {
propDoor = new DoorProperty(this, item, scene);
propDoor->show();
}
///////////////////////////////Wall/////////////////////////
else if(dItem->diagramType() == 1) {
propWall = new WallProperty(this, item, scene);
propWall->show();
}
///////////////////////////////Window///////////////////////
else if(dItem->diagramType() == 2) {
propWindow = new PropertyWindow(this, item, scene);
propWindow->exec();
}
///////////////////////Lift/////////////////////////////////
else if(dItem->diagramType() == 3) {
propLift = new LiftProperty(this, item, scene);
propLift->show();
}
/////////////////////////Stairway///////////////////////////
else if(dItem->diagramType() == 4) {
propStairway = new StairwayProperty(this, item, scene);
propStairway->exec();
}
//////////////////////Portal////////////////////////////////
else if(dItem->diagramType() == 5) {
portalProp = new PortalProperty(this, item, scene);
qDebug() << "Portal\n" << item->scenePos();
qDebug() << dItem->getDimension().x() << dItem->getDimension().y();
portalProp->exec();
}
///////////////////////////room///////////////////////////
else if(dItem->diagramType() == 6) {
propRoom = new RoomProperty(this, item, scene);
propRoom->exec();
}
}
}
break;
default:
break;
}
}
} void MainWindow::toggleGrid(bool grid) { scene = listScene.at(tabWidget->currentIndex());
view = listView.at(tabWidget->currentIndex());
scene->setGridVisible(grid);
view->repaint();
QPointF topLeft = view->mapToScene( 0, 0 );
QPointF bottomRight = view->mapToScene( view->viewport()->width() - 1,
view->viewport()->height() - 1 );
scene->invalidate(topLeft.x(), topLeft.y(),
bottomRight.x() - topLeft.x(),
bottomRight.y() - topLeft.y());
//scene->update();
//view->update();
} void MainWindow::setGrid() {
scene = listScene.at(tabWidget->currentIndex());
view = listView.at(tabWidget->currentIndex()); if(scene->isGridVisible()) {
QPointF topLeft = view->mapToScene(0, 0);
QPointF bottomRight = view->mapToScene( view->viewport()->width() - 1,
view->viewport()->height() - 1 );
qreal width = bottomRight.x() - topLeft.x();
qreal height = bottomRight.y() - topLeft.y();
qreal zw = width;
//std::cout << width << "/" << height << std::endl;
if(zw < height) zw = height;
int n = int(zw)/int(myGrid);
int k = 1;
while(n/k > 50)
k = k*2;
//std::cout << k << std::endl;
scene->setGridScale(k);
scene->update();
}
} void MainWindow::saveAs() {
//scene = listScene.at(tabWidget->currentIndex());
QFileDialog::Options options;
options = 0;
QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName(this,
tr(mwSaveAs),
".rintd",
tr("DesignerRINTD (*.rintd)"),
&selectedFilter,
options);
if (!fileName.isEmpty()){
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr(mwSaveAsError), file.errorString());
}
else {
scene->wS = widthScene;
scene->hS = heightScene;
if(scene->save(&file))
myFileName = fileName;
file.close();
if(file.error()) {
QMessageBox::warning(this, tr(mwSaveAsError), file.errorString());
/*std::cerr << "Error: cannot write file "
<< qPrintable(file.fileName())
<< qPrintable(file.errorString())
<< std::endl ;*/
}
}
}
} void MainWindow::slotLoadImage() {
QString fileName = QFileDialog::getOpenFileName(this,
tr(mwOpenImage), QDir::currentPath());
if (!fileName.isEmpty()) {
QImage image(fileName);
if (image.isNull()) {
QMessageBox::information(this, tr("DEP"),
tr(mwOpenImageError).arg(fileName));
return;
} scene = listScene.at(tabWidget->currentIndex());
scene->setSceneRect(0,0, image.width(), image.height());
scene->addPixmap(QPixmap::fromImage(image));
if(image.width() != 0 && image.height() != 0) {
widthScene = image.width();
heightScene = image.height();
} else {
widthScene = heightScene = 1000;
}
view->update();
}
} void MainWindow::save() {
if (!myFileName.isEmpty()) {
QFile file(myFileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::warning(this, tr(mwSaveAsError), file.errorString());
}
else {
scene->wS = widthScene;
scene->hS = heightScene;
scene->save(&file);
}
}
} void MainWindow::load() {
scene = listScene.at(tabWidget->currentIndex());
QFileDialog::Options options;
options = 0;
QString selectedFilter;
QString fileName = QFileDialog::getOpenFileName(this,
tr(mwLoadPlan),
".rintd",
tr("DesignerRINTD (*.rintd)"),
&selectedFilter,
options);
if (!fileName.isEmpty()) {
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
QMessageBox::warning(this, tr(mwLoadPlanError), file.errorString());
}
else {
scene->clear();
scene->load(&file);
myFileName = fileName;
} }
} Файл diagramscene.cpp
#include
#include |