⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arrow.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2007-2007 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include <QtGui>#include "arrow.h"#include <math.h>const qreal Pi = 3.14;Arrow::Arrow(DiagramItem *startItem, DiagramItem *endItem,         QGraphicsItem *parent, QGraphicsScene *scene)    : QGraphicsLineItem(parent, scene){    myStartItem = startItem;    myEndItem = endItem;    setFlag(QGraphicsItem::ItemIsSelectable, true);    myColor = Qt::black;    setPen(QPen(myColor, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));}QRectF Arrow::boundingRect() const{    qreal extra = (pen().width() + 20) / 2.0;    return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),                                      line().p2().y() - line().p1().y()))        .normalized()        .adjusted(-extra, -extra, extra, extra);}QPainterPath Arrow::shape() const{    QPainterPath path = QGraphicsLineItem::shape();    path.addPolygon(arrowHead);    return path;}void Arrow::updatePosition(){    QLineF line(mapFromItem(myStartItem, 0, 0), mapFromItem(myEndItem, 0, 0));    setLine(line);}void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem *,          QWidget *){    if (myStartItem->collidesWithItem(myEndItem))        return;    QPen myPen = pen();    myPen.setColor(myColor);    qreal arrowSize = 20;    painter->setPen(myPen);    painter->setBrush(myColor);    QLineF centerLine(myStartItem->pos(), myEndItem->pos());    QPolygonF endPolygon = myEndItem->polygon();    QPointF p1 = endPolygon.first() + myEndItem->pos();    QPointF p2;    QPointF intersectPoint;    QLineF polyLine;    for (int i = 1; i < endPolygon.count(); ++i) {    p2 = endPolygon.at(i) + myEndItem->pos();    polyLine = QLineF(p1, p2);    QLineF::IntersectType intersectType =        polyLine.intersect(centerLine, &intersectPoint);    if (intersectType == QLineF::BoundedIntersection)        break;        p1 = p2;    }    setLine(QLineF(intersectPoint, myStartItem->pos()));    double angle = ::acos(line().dx() / line().length());    if (line().dy() >= 0)        angle = (Pi * 2) - angle;        QPointF arrowP1 = line().p1() + QPointF(sin(angle + Pi / 3) * arrowSize,                                        cos(angle + Pi / 3) * arrowSize);        QPointF arrowP2 = line().p1() + QPointF(sin(angle + Pi - Pi / 3) * arrowSize,                                        cos(angle + Pi - Pi / 3) * arrowSize);        arrowHead.clear();        arrowHead << line().p1() << arrowP1 << arrowP2;        painter->drawLine(line());        painter->drawPolygon(arrowHead);        if (isSelected()) {            painter->setPen(QPen(myColor, 1, Qt::DashLine));        QLineF myLine = line();        myLine.translate(0, 4.0);        painter->drawLine(myLine);        myLine.translate(0,-8.0);        painter->drawLine(myLine);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -