看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));
}
}
- 看qt书的第一个作品
- 看qt书的第一个作品 图标编辑器。。。
- 我的第一个作品
- 在学校的第一个作品
- 自己写的第一个PHP作品
- 我的第一个Android软件作品
- 大一的第一个作品--【贪吃蛇】
- 第一个网页作品
- 第一个j2me手机软件作品
- 我的第一个完整的JAVA作品
- 我的第一个OpenGL作品——《My Robot》
- 我发布的第一个java作品:Sogou file uploader
- 今天下午完成了我的第一个JSP程序作品
- 强袭自由高达,我的第一个作品
- 我的第一个flash作品-遮罩层-瀑布
- 我的第一个作品(编程环境:Code::Blocks + wxWidgets)
- 我的第一个java作品——五子棋
- 扫雷:我的Java之路--第一个小作品
- oracle总结之九———约束
- 今天winform有感
- 我的世界就是这样的
- 对字符串进行拆分
- 在命令行下实现打字效果
- 看qt书的第一个作品
- oracle总结之十———PL/SQL编程
- 学习C语言的小知识点
- C语言:反向输出
- 进阶之路
- 这么多天,又过去了
- spring基础
- spring的自动装配
- 小游戏---预言