Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
#include <QColor>
#include 
<QImage>
#include 
<QtGui/QWidget>

class Widget : 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:
    Widget(QWidget 
*parent = 0);
    
~Widget();

    
void   setPenColor(const QColor& newColor);
    QColor penColor()
const{return curColor;}
    
void   setZoomFactor(int newZoom);
    
int    zoomFactor()const{return zoom;}
    
void   setIconImage(const QImage& image);
    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;
};

#include <QtGui>
#include "widget.h"
Widget::Widget(QWidget *parent)
 : QWidget(parent)
{
 this->setAttribute(Qt::WA_StaticContents);
 this->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
 this->curColor = Qt::black;
 this->zoom = 8;
 image = QImage(16,16,QImage::Format_ARGB32);
 image.fill(qRgba(0,0,0,0));
}
Widget::~Widget()
{ 
}
QSize Widget::sizeHint()const
{
 QSize size = zoom * image.size();
 if(zoom >= 3)
 size += QSize(1,1);
 return size;
}
void Widget::setPenColor(const QColor& newColor)
{
 curColor = newColor;
}
void Widget::setIconImage(const QImage& image)
{
 if(this->image != image)
 {
 this->image = image.convertToFormat(QImage::Format_ARGB32);
 update();
 this->updateGeometry();
 }
}
void Widget::paintEvent(QPaintEvent* event)
{
 QPainter painter(this);
 if(zoom >=3)
 {
 painter.setPen(this->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 = this->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 Widget::pixelRect(int i, int j) const
{
 if(zoom >=3)
 return QRect(zoom*i+1,zoom*j+1,zoom-1,zoom-1);
 return QRect(zoom*i,zoom*j,zoom,zoom);
}
void Widget::mousePressEvent(QMouseEvent *event)
{
 if(event->button() == Qt::LeftButton)
 setImagePixel(event->pos(),true);
 else if(event->button() == Qt::RightButton)
 setImagePixel(event->pos(),false);
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
 if(event->buttons() & Qt::LeftButton)
 setImagePixel(event->pos(),true);
 else if(event->buttons() & Qt::RightButton)
 setImagePixel(event->pos(),false);
}
void Widget::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));
 this->update(this->pixelRect(i,j));
 }
}
void Widget::setZoomFactor(int newZoom)
{
 if(newZoom < 1)
 newZoom = 1;
 if(newZoom != zoom)
 {
 zoom = newZoom;
 update();
 updateGeometry();
 }
}
几点说明:
1.宏 Q_PROPERTY 声明属性读写属性
2.setSizePolicy(.,.) 说明控件最小尺寸为推荐尺寸
3.sizeHint() 获得控件推荐尺寸
4.控件 update()/updateGeometry()用于下次重绘和调整控件尺寸
5.在函数paintEvent中绘制图元
6.一个控件的调色板有3个颜色组 激活,非激活,不可用
posted on 2011-08-03 22:15 ccsdu2009 阅读(1023) 评论(0)  编辑 收藏 引用 所属分类: QT编程

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理