最近看了《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));
}
}