class IconEditor : public QWidget

来源:互联网 发布:淘宝乡村服务站加盟 编辑:程序博客网 时间:2024/05/20 21:44
#ifndef ICONEDITOR_H#define ICONEDITOR_H#include <QColor>#include <QImage>#include <QWidget>class IconEditor : public QWidget{    Q_OBJECT    Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)    Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)    Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)public:    IconEditor(QWidget *parent = 0);    void setPenColor(const QColor &newColor);    QColor penColor() const { return curColor; }    void setZoomFactor(int newZoom);    int zoomFactor() const { return zoom; }    void setIconImage(const QImage &newImage);    QImage iconImage() const { return image; }    QSize sizeHint() const;protected:    void mousePressEvent(QMouseEvent *event);    void mouseMoveEvent(QMouseEvent *event);    void paintEvent(QPaintEvent *event);private:    void setImagePixel(const QPoint &pos, bool opaque);    QRect pixelRect(int i, int j) const;    QColor curColor;    QImage image;    int zoom;};#endif
#include <QtGui>#include "iconeditor.h"IconEditor::IconEditor(QWidget *parent)    : QWidget(parent){    setAttribute(Qt::WA_StaticContents);    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);    curColor = Qt::black;    zoom = 8;    image = QImage(16, 16, QImage::Format_ARGB32);    image.fill(qRgba(0, 0, 0, 0));}void IconEditor::setPenColor(const QColor &newColor){    curColor = newColor;}void IconEditor::setZoomFactor(int newZoom){    if (newZoom < 1)        newZoom = 1;    if (newZoom != zoom) {        zoom = newZoom;        update();        updateGeometry();    }}void IconEditor::setIconImage(const QImage &newImage){    if (newImage != image) {        image = newImage.convertToFormat(QImage::Format_ARGB32);        update();        updateGeometry();    }}QSize IconEditor::sizeHint() const{    QSize size = zoom * image.size();    if (zoom >= 3)        size += QSize(1, 1);    return size;}void IconEditor::mousePressEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton) {        setImagePixel(event->pos(), true);    } else if (event->button() == Qt::RightButton) {        setImagePixel(event->pos(), false);    }}void IconEditor::mouseMoveEvent(QMouseEvent *event){    if (event->buttons() & Qt::LeftButton) {        setImagePixel(event->pos(), true);    } else if (event->buttons() & Qt::RightButton) {        setImagePixel(event->pos(), false);    }}void IconEditor::paintEvent(QPaintEvent *event){    QPainter painter(this);    if (zoom >= 3) {        painter.setPen(palette().foreground().color());        for (int i = 0; i <= image.width(); ++i)            painter.drawLine(zoom * i, 0,                             zoom * i, zoom * image.height());        for (int j = 0; j <= image.height(); ++j)            painter.drawLine(0, zoom * j,                             zoom * image.width(), zoom * j);    }    for (int i = 0; i < image.width(); ++i) {        for (int j = 0; j < image.height(); ++j) {            QRect rect = pixelRect(i, j);            if (!event->region().intersect(rect).isEmpty()) {                QColor color = QColor::fromRgba(image.pixel(i, j));                if (color.alpha() < 255)                    painter.fillRect(rect, Qt::white);                painter.fillRect(rect, color);            }        }    }}void IconEditor::setImagePixel(const QPoint &pos, bool opaque){    int i = pos.x() / zoom;    int j = pos.y() / zoom;    if (image.rect().contains(i, j)) {        if (opaque) {            image.setPixel(i, j, penColor().rgba());        } else {            image.setPixel(i, j, qRgba(0, 0, 0, 0));        }        update(pixelRect(i, j));    }}QRect IconEditor::pixelRect(int i, int j) const{    if (zoom >= 3) {        return QRect(zoom * i + 1, zoom * j + 1, zoom - 1, zoom - 1);    } else {        return QRect(zoom * i, zoom * j, zoom, zoom);    }}