Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481606
  • 博文数量: 42
  • 博客积分: 2100
  • 博客等级: 大尉
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-07 21:07
文章分类

全部博文(42)

文章存档

2011年(1)

2010年(18)

2009年(16)

2008年(7)

分类: LINUX

2010-04-16 23:44:17

QPixmapQImage

今天写了一下QT两个图像类(QT中与图像相关类很多)的程序。熟悉一下两者的基本用法以及区别。

环境:

OS:红旗6.02,内核版本:2.6.28(我升级过的)

编辑器:emacs 23

Qt版本:Qt-4.5.0

说明:源代码包中的make.shqmake是绝对路径,因为红旗已安装QT3,直接qmake会调用QT3的编译器,而我不会正确设置PATH,只好出此下策了。

使用方法:

1、编译:正确安装qt后,在工程目录下运行./make.sh即可,如出错,请慢慢找原因。

2、清除:直接支持./clean.sh即可。

 

程序的代码非常简单,主要就是实现了painEvent方法,再在main函数中调用窗口的show方法,就可以了。下面分析一下代码。

 

头文件代码:

 

#ifndef _IMAGEWIDGET_H
#define _IMAGEWIDGET_H

#include <QtGui>
class CImageWidget:public QWidget
{
    Q_OBJECT

public:
    CImageWidget(QWidget *parent = 0); 
    void paintEvent(QPaintEvent *); //关键是实现此方法
};
#endif

相应的实现文件代码:

 

#include "imagewidget.h"


CImageWidget::CImageWidget(QWidget *parent)
    :QWidget(parent)
{
    
// set the title
    setWindowTitle(tr("a simple widget!"));
    resize(640, 480);
//设置窗口大小
}

void CImageWidget::paintEvent(QPaintEvent *)

{
    QPainter painter(this);


    QImage image;
    image.load(":/images/bruce.jpg");
//加载
    painter.drawImage(0, 0, image, 0, 0, 320, 480);
    QPixmap pix;

//下面的两行代码,只取其一即可。

// pix.load(":/images/bruce.jpg");

    pix = pix.fromImage(image);
//测试从QImage转换到QPixmap
    painter.drawPixmap(320, 0, 320, 480, pix);
}

 

解释其中的几行代码。

1image.load(":/images/bruce.jpg");

加载工程目录下的images子目录的bruce.jpg文件。注意它的写法。

2 painter.drawImage(0, 0, image, 0, 0, 320, 480);

drawImageQPainter的一个方法,这里的意思是将image对象放到窗口的(0,0)位置,亦即左上角,最后两个数字是指定的大小。它的原型如下:

void QPainter::drawImage ( int x, int y, const QImage & image, int sx = 0, int sy = 0, int sw = -1, int sh = -1, flags = Qt::AutoColor )

文档中解释为:

Draws an image at (x, y) by copying a part of image into the paint device. (x, y) specifies the top-left point in the paint device that is to be drawn onto. (sx, sy) specifies the top-left point in image that is to be drawn. The default is (0, 0). (sw, sh) specifies the size of the image that is to be drawn. The default, (0, 0) (and negative) means all the way to the bottom-right of the image.

sxsy是指图像左上角的坐标,swsh是指定了图像的大小,如果都为0或负数,就显示完整个图像。

3 painter.drawPixmap(320, 0, 320, 480, pix);

drawPixmap也是QPainter的一个方法,它将pix对象放到(320,0)处,大小为(320,480)。它的原型很简单,就不列出来了。

至于这些坐标数据,可以看到我在构造函数是设定了窗口大小为640X480,这样,两张图像恰好位于左右两边。

主函数也很简单:

#include <QApplication>
#include "imagewidget.h"


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    CImageWidget w;
    w.show();
    return app.exec();
}

That’s it!

效果图如下,仔细看一下,就可以看到两者的区别了。各位可以改变它们的大小,来观察一下变化。

 

 

一些话:

小弟没有采用Qt Designer,这是经过我几天的考虑,权衡再三,最终下定决心的,而使用emacs同样也是我下了很大决心的——我从寒假在家就开始学习使用emacs,现在emacs正在配置各种插件,目前有点习惯使用它了,等过段时间就写一下总结。

(PS:今天指导老师又催毕业设计进度了)

 

源代码:

 
文件: imagewidget.zip
大小: 169KB
下载: 下载




阅读(8403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~