Diagram Scene Example▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include
"diagramscene.h"
#include
"arrow.h"
#include <QTextCursor>
#include <QGraphicsSceneMouseEvent>
DiagramScene::
DiagramScene(QMenu *
itemMenu, QObject *
parent)
:
QGraphicsScene(parent)
{
myItemMenu =
itemMenu;
myMode =
MoveItem;
myItemType =
DiagramItem::
Step;
line =
0
;
textItem =
0
;
myItemColor =
Qt::
white;
myTextColor =
Qt::
black;
myLineColor =
Qt::
black;
}
void
DiagramScene::
setLineColor(const
QColor &
amp;color)
{
myLineColor =
color;
if
(isItemChange(Arrow::
Type)) {
Arrow *
item =
qgraphicsitem_cast&
lt;Arrow *&
gt;(selectedItems().first());
item-&
gt;setColor(myLineColor);
update();
}
}
void
DiagramScene::
setTextColor(const
QColor &
amp;color)
{
myTextColor =
color;
if
(isItemChange(DiagramTextItem::
Type)) {
DiagramTextItem *
item =
qgraphicsitem_cast&
lt;DiagramTextItem *&
gt;(selectedItems().first());
item-&
gt;setDefaultTextColor(myTextColor);
}
}
void
DiagramScene::
setItemColor(const
QColor &
amp;color)
{
myItemColor =
color;
if
(isItemChange(DiagramItem::
Type)) {
DiagramItem *
item =
qgraphicsitem_cast&
lt;DiagramItem *&
gt;(selectedItems().first());
item-&
gt;setBrush(myItemColor);
}
}
void
DiagramScene::
setFont(const
QFont &
amp;font)
{
myFont =
font;
if
(isItemChange(DiagramTextItem::
Type)) {
QGraphicsTextItem *
item =
qgraphicsitem_cast&
lt;DiagramTextItem *&
gt;(selectedItems().first());
//At this point the selection can change so the first selected item might not be a DiagramTextItem
if
(item)
item-&
gt;setFont(myFont);
}
}
void
DiagramScene::
setMode(Mode mode)
{
myMode =
mode;
}
void
DiagramScene::
setItemType(DiagramItem::
DiagramType type)
{
myItemType =
type;
}
void
DiagramScene::
editorLostFocus(DiagramTextItem *
item)
{
QTextCursor cursor =
item-&
gt;textCursor();
cursor.clearSelection();
item-&
gt;setTextCursor(cursor);
if
(item-&
gt;toPlainText().isEmpty()) {
removeItem(item);
item-&
gt;deleteLater();
}
}
void
DiagramScene::
mousePressEvent(QGraphicsSceneMouseEvent *
mouseEvent)
{
if
(mouseEvent-&
gt;button() !=
Qt::
LeftButton)
return
;
DiagramItem *
item;
switch
(myMode) {
case
InsertItem:
item =
new
DiagramItem(myItemType, myItemMenu);
item-&
gt;setBrush(myItemColor);
addItem(item);
item-&
gt;setPos(mouseEvent-&
gt;scenePos());
emit itemInserted(item);
break
;
case
InsertLine:
line =
new
QGraphicsLineItem(QLineF(mouseEvent-&
gt;scenePos(),
mouseEvent-&
gt;scenePos()));
line-&
gt;setPen(QPen(myLineColor, 2
));
addItem(line);
break
;
case
InsertText:
textItem =
new
DiagramTextItem();
textItem-&
gt;setFont(myFont);
textItem-&
gt;setTextInteractionFlags(Qt::
TextEditorInteraction);
textItem-&
gt;setZValue(1000.0
);
connect(textItem, SIGNAL(lostFocus(DiagramTextItem*
)),
this
, SLOT(editorLostFocus(DiagramTextItem*
)));
connect(textItem, SIGNAL(selectedChange(QGraphicsItem*
)),
this
, SIGNAL(itemSelected(QGraphicsItem*
)));
addItem(textItem);
textItem-&
gt;setDefaultTextColor(myTextColor);
textItem-&
gt;setPos(mouseEvent-&
gt;scenePos());
emit textInserted(textItem);
default
:
;
}
QGraphicsScene::
mousePressEvent(mouseEvent);
}
void
DiagramScene::
mouseMoveEvent(QGraphicsSceneMouseEvent *
mouseEvent)
{
if
(myMode ==
InsertLine &
amp;&
amp; line !=
0
) {
QLineF newLine(line-&
gt;line().p1(), mouseEvent-&
gt;scenePos());
line-&
gt;setLine(newLine);
}
else
if
(myMode ==
MoveItem) {
QGraphicsScene::
mouseMoveEvent(mouseEvent);
}
}
void
DiagramScene::
mouseReleaseEvent(QGraphicsSceneMouseEvent *
mouseEvent)
{
if
(line !=
0
&
amp;&
amp; myMode ==
InsertLine) {
QList&
lt;QGraphicsItem *&
gt; startItems =
items(line-&
gt;line().p1());
if
(startItems.count() &
amp;&
amp; startItems.first() ==
line)
startItems.removeFirst();
QList&
lt;QGraphicsItem *&
gt; endItems =
items(line-&
gt;line().p2());
if
(endItems.count() &
amp;&
amp; endItems.first() ==
line)
endItems.removeFirst();
removeItem(line);
delete
line;
if
(startItems.count() &
gt; 0
&
amp;&
amp; endItems.count() &
gt; 0
&
amp;&
amp;
startItems.first()-&
gt;type() ==
DiagramItem::
Type &
amp;&
amp;
endItems.first()-&
gt;type() ==
DiagramItem::
Type &
amp;&
amp;
startItems.first() !=
endItems.first()) {
DiagramItem *
startItem =
qgraphicsitem_cast&
lt;DiagramItem *&
gt;(startItems.first());
DiagramItem *
endItem =
qgraphicsitem_cast&
lt;DiagramItem *&
gt;(endItems.first());
Arrow *
arrow =
new
Arrow(startItem, endItem);
arrow-&
gt;setColor(myLineColor);
startItem-&
gt;addArrow(arrow);
endItem-&
gt;addArrow(arrow);
arrow-&
gt;setZValue(-
1000.0
);
addItem(arrow);
arrow-&
gt;updatePosition();
}
}
line =
0
;
QGraphicsScene::
mouseReleaseEvent(mouseEvent);
}
bool
DiagramScene::
isItemChange(int
type)
{
foreach (QGraphicsItem *
item, selectedItems()) {
if
(item-&
gt;type() ==
type)
return
true
;
}
return
false
;
}