看qt书的第一个作品

来源:互联网 发布:原生js创建标签 编辑:程序博客网 时间:2024/04/30 22:31

  最近看了《c++ GUI qt4编程》,做了个简单的程序。。。

是第五章的“创建自定义窗口部件”,是一个图标编辑器。。。

书上只能一个一个的点,我另外加了点功能,就是可以拖动,并且颜色会随机改变。。。

代码如下:

//        iconeditor.h

#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(QColor const& newColor);
    QColor penColor() const
    {
        return curColor;
    }
    void setZoomFactor(int newZoom);
    int zoomFactor() const
    {
        return zoom;
    }
    void setIconImage(QImage const& newImage);
    QImage iconImage() const
    {
        return image;
    }
    QSize sizeHint() const;
protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
private:
    void setImagePixel(QPoint const& pos,bool opaque);
    QRect pixelRect(int i,int j) const;
 
    QColor curColor;
    QImage image;
    int zoom;
    bool s;
 
};
 
#endif // ICONEDITOR_H
 

//         iconeditor.cpp

#include <QtGui>

#include "iconeditor.h"
#include "QTime"
 
IconEditor::IconEditor(QWidget *parent):QWidget(parent)
{
    setWindowIcon(QIcon(":/title.png"));
    setAttribute(Qt::WA_StaticContents);
    setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
 
    curColor=Qt::green;
    zoom=8;
 
    image=QImage(100,100,QImage::Format_ARGB32);
    image.fill(qRgba(0,0,0,0));
}
QSize IconEditor::sizeHint() const
{
    QSize size=zoom*image.size();
    if(zoom>=3)
        size+=QSize(1,1);
    return size;
 
}
void IconEditor::setPenColor(QColor const& newColor)
{
    curColor=newColor;
}
void IconEditor::setIconImage(const QImage &newImage)
{
    if(newImage!=image)
    {
        image=newImage.convertToFormat(QImage::Format_ARGB32);
        update();
        updateGeometry();
    }
}
void IconEditor::setZoomFactor(int newZoom)
{
    if(newZoom<1)
        newZoom=1;
    if(newZoom!=zoom)
    {
        zoom=newZoom;
        update();
        updateGeometry();
    }
}
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);
            }
        }
}
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);
    }
}
void IconEditor::mousePressEvent(QMouseEvent *event)
{
    s=true;
    QTime t;
    t= QTime::currentTime();
    qsrand(t.msec()+t.second()*1000);
    //int n = qrand();
 
    if(event->button()==Qt::LeftButton)
    {
        setImagePixel(event->pos(),true);
        curColor=QColor(qrand()%255,qrand()%255,qrand()%255,qrand()%255);
    }
    else if(event->button()==Qt::RightButton)
    {
        setImagePixel(event->pos(),false);
    }
}
void IconEditor::mouseReleaseEvent(QMouseEvent *event)
{
    s=false;
}
void IconEditor::mouseMoveEvent(QMouseEvent *event)
{
    if(s==true)
        setImagePixel(event->pos(),true);
 
    if(event->button()&Qt::LeftButton)
    {
        setImagePixel(event->pos(),true);
    }
    else if(event->button()&Qt::RightButton)
    {
        setImagePixel(event->pos(),false);
    }
}
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));
    }
}
 
原创粉丝点击