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

📄 displayshape.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2005-2006 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://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** 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 <math.h>#include <QtGui>#include "displayshape.h"DisplayShape::DisplayShape(const QPointF &position, const QSizeF &maxSize)    : pos(position), maxSize(maxSize), interactive(false){}bool DisplayShape::animate(){    if (!targetPos.isNull()) {        QLineF displacement(pos, targetPos);        QPointF newPosition = displacement.pointAt(0.25);        if (displacement.length() <= 1.0) {            pos = targetPos;            targetPos = QPointF();        } else {            pos = newPosition;        }        return true;    }    return false;}bool DisplayShape::contains(const QString &key) const{    return meta.contains(key);}bool DisplayShape::isInteractive() const{    return interactive;}QVariant DisplayShape::metaData(const QString &key) const{    return meta.value(key);}void DisplayShape::paint(QPainter *painter) const{    painter->save();    painter->drawImage(pos, image);    painter->restore();}QPointF DisplayShape::position() const{    return pos;}QRectF DisplayShape::rect() const{    return QRectF(pos, image.size());}void DisplayShape::removeMetaData(const QString &key){    meta.remove(key);}void DisplayShape::setInteractive(bool enable){    interactive = enable;}void DisplayShape::setMetaData(const QString &key, const QVariant &value){    meta[key] = value;}void DisplayShape::setPosition(const QPointF &position){    pos = position;}void DisplayShape::setSize(const QSizeF &size){    maxSize = size;}void DisplayShape::setTarget(const QPointF &position){    targetPos = position;}QSizeF DisplayShape::size() const{    return maxSize;}QPointF DisplayShape::target() const{    return targetPos;}PanelShape::PanelShape(const QPainterPath &path, const QBrush &normal,                       const QBrush &highlighted, const QPen &pen,                       const QPointF &position, const QSizeF &maxSize)    : DisplayShape(position, maxSize), highlightedBrush(highlighted),      normalBrush(normal), path(path), pen(pen){    brush = normalBrush;}bool PanelShape::animate(){    bool updated = false;    if (!meta.contains("destroy")) {        if (meta.contains("fade")) {            QColor penColor = pen.color();            QColor brushColor = brush.color();            int penAlpha = penColor.alpha();            int brushAlpha = brushColor.alpha();            int fadeMinimum = meta.value("fade minimum").toInt();            if (penAlpha != fadeMinimum || brushAlpha != fadeMinimum                || meta.value("fade").toInt() > 0) {                penAlpha = qBound(fadeMinimum,                                  penAlpha + meta.value("fade").toInt(), 255);                brushAlpha = qBound(fadeMinimum,                                  brushAlpha + meta.value("fade").toInt(), 255);                penColor.setAlpha(penAlpha);                brushColor.setAlpha(brushAlpha);                pen.setColor(penColor);                brush.setColor(brushColor);                if (penAlpha == 0 && brushAlpha == 0) {                    meta["destroy"] = true;                    meta.remove("fade");                } else if (penAlpha == 255 && brushAlpha == 255)                    meta.remove("fade");                updated = true;            }        } else if (meta.contains("highlight")) {            qreal scale = meta.value("highlight scale").toDouble();            QColor color = brush.color();            if (meta.value("highlight").toBool())                scale = qBound(0.0, scale + 0.5, 1.0);            else                scale = qBound(0.0, scale - 0.2, 1.0);            if (scale == 0.0) {                brush = normalBrush;                meta.remove("highlight");                meta.remove("highlight scale");                updated = true;            } else if (scale != meta["highlight scale"]) {                meta["highlight scale"] = scale;                if (scale == 1.0)                    brush = highlightedBrush;                else {                    QColor normal = normalBrush.color();                    QColor highlighted = highlightedBrush.color();                    color.setRedF((1.0-scale) * normal.redF()                                  + scale*highlighted.redF());                    color.setGreenF((1.0-scale) * normal.greenF()                                    + scale*highlighted.greenF());                    color.setBlueF((1.0-scale) * normal.blueF()                                   + scale*highlighted.blueF());                    brush.setColor(color);                }                updated = true;            }        }    }    return DisplayShape::animate() || updated;}void PanelShape::paint(QPainter *painter) const{    painter->save();    painter->setRenderHint(QPainter::Antialiasing);    painter->setBrush(brush);    painter->setPen(pen);    painter->translate(pos);    painter->drawPath(path);    painter->restore();}QRectF PanelShape::rect() const{    return QRectF(pos + path.boundingRect().topLeft(),                  path.boundingRect().size());}TitleShape::TitleShape(const QString &text, const QFont &f,                       const QPen &pen, const QPointF &position,                       const QSizeF &maxSize, Qt::Alignment alignment)    : DisplayShape(position, maxSize), font(f), text(text), pen(pen),      alignment(alignment){    QFontMetricsF fm(font);    textRect = fm.boundingRect(QRectF(QPointF(0, 0), maxSize), alignment, text);    qreal textWidth = qMax(fm.width(text), textRect.width());    qreal textHeight = qMax(fm.height(), textRect.height());    qreal scale = qMin(maxSize.width()/textWidth,                       maxSize.height()/textHeight);    font.setPointSizeF(font.pointSizeF() * scale);    fm = QFontMetricsF(font);    textRect = fm.boundingRect(QRectF(QPointF(0, 0), maxSize), alignment, text);    baselineStart = QPointF(textRect.left(), textRect.bottom() - fm.descent());}bool TitleShape::animate(){    bool updated = false;    if (!meta.contains("destroy")) {        if (meta.contains("fade")) {            QColor penColor = pen.color();            int penAlpha = penColor.alpha();            penAlpha = qBound(meta.value("fade minimum").toInt(),                              penAlpha + meta.value("fade").toInt(), 255);            penColor.setAlpha(penAlpha);            pen.setColor(penColor);            if (penAlpha == 0) {                meta["destroy"] = true;                meta.remove("fade");            } else if (penAlpha == 255)                meta.remove("fade");            updated = true;        }    }    return DisplayShape::animate() || updated;}void TitleShape::paint(QPainter *painter) const{    QRectF rect(textRect);    rect.translate(pos);    painter->save();    painter->setRenderHint(QPainter::TextAntialiasing);    painter->setPen(pen);    painter->setFont(font);    painter->drawText(pos + baselineStart, text);    painter->restore();}QRectF TitleShape::rect() const{    QRectF rect(textRect);    return rect.translated(pos);}ImageShape::ImageShape(const QImage &original, const QPointF &position,                       const QSizeF &maxSize, int alpha,                       Qt::Alignment alignment)    : DisplayShape(position, maxSize), alpha(alpha), alignment(alignment){    source = original.convertToFormat(QImage::Format_ARGB32_Premultiplied);    qreal scale = qMin(qMin(maxSize.width()/source.width(),                            maxSize.height()/source.height()), qreal(1.0));    source = source.scaled(int(ceil(source.width() * scale)),                           int(ceil(source.height() * scale)),                           Qt::KeepAspectRatio,                           Qt::SmoothTransformation);    image = QImage(source.size(), QImage::Format_ARGB32_Premultiplied);    offset = QPointF(0.0, 0.0);    if (alignment & Qt::AlignHCenter)        offset.setX((maxSize.width() - image.width())/2);    else if (alignment & Qt::AlignRight)        offset.setX(maxSize.width() - image.width());    if (alignment & Qt::AlignVCenter)        offset.setY((maxSize.height() - image.height())/2);    else if (alignment & Qt::AlignBottom)        offset.setY(maxSize.height() - image.height());    redraw();}void ImageShape::redraw(){    image.fill(qRgba(alpha, alpha, alpha, alpha));    QPainter painter;    painter.begin(&image);    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);    painter.drawImage(0, 0, source);    painter.end();}void ImageShape::paint(QPainter *painter) const{    painter->drawImage(pos + offset, image);}QRectF ImageShape::rect() const{    return QRectF(pos, maxSize);}bool ImageShape::animate(){    bool updated = false;    if (!meta.contains("destroy")) {        if (meta.contains("fade")) {            alpha = qBound(meta.value("fade minimum").toInt(),                           alpha + meta.value("fade").toInt(), 255);            redraw();            if (alpha == 0) {                meta["destroy"] = true;                meta.remove("fade");            } else if (alpha == 255)                meta.remove("fade");            updated = true;        }    }    return DisplayShape::animate() || updated;}DocumentShape::DocumentShape(const QString &text, const QFont &font,                             const QPointF &position, const QSizeF &maxSize,                             int alpha)    : DisplayShape(position, maxSize), alpha(alpha){    textDocument.setHtml(text);    textDocument.setDefaultFont(font);    textDocument.setPageSize(maxSize);    QSizeF documentSize = textDocument.documentLayout()->documentSize();    setSize(QSizeF(maxSize.width(),                      qMin(maxSize.height(), documentSize.height())));    source = QImage(int(ceil(documentSize.width())),                    int(ceil(documentSize.height())),                    QImage::Format_ARGB32_Premultiplied);    source.fill(qRgba(255, 255, 255, 255));    QAbstractTextDocumentLayout::PaintContext context;    textDocument.documentLayout()->setPaintDevice(&source);    QPainter painter;    painter.begin(&source);    painter.setRenderHint(QPainter::TextAntialiasing);    painter.setRenderHint(QPainter::Antialiasing);    textDocument.documentLayout()->draw(&painter, context);    painter.end();    source = source.scaled(int(ceil(maxSize.width())),                           int(ceil(maxSize.height())),                           Qt::KeepAspectRatio,                           Qt::SmoothTransformation);    image = QImage(source.size(), source.format());    redraw();}DocumentShape::~DocumentShape(){}bool DocumentShape::animate(){    bool updated = false;    if (!meta.contains("destroy")) {        if (meta.contains("fade")) {            alpha = qBound(meta.value("fade minimum").toInt(),                           alpha + meta.value("fade").toInt(), 255);            redraw();            if (alpha == 0) {                meta["destroy"] = true;                meta.remove("fade");            } else if (alpha == 255)                meta.remove("fade");            updated = true;        }    }    return DisplayShape::animate() || updated;}void DocumentShape::redraw(){    image.fill(qRgba(alpha, alpha, alpha, alpha));    QPainter painter;    painter.begin(&image);    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);    painter.drawImage(0, 0, source);    painter.end();}void DocumentShape::paint(QPainter *painter) const{    painter->drawImage(pos, image);}QRectF DocumentShape::rect() const{    return QRectF(pos, maxSize);}

⌨️ 快捷键说明

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