<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>岁月无声</title>
	<atom:link href="http://hacktao.com/feed" rel="self" type="application/rss+xml" />
	<link>http://hacktao.com</link>
	<description>Hacktao</description>
	<lastBuildDate>Thu, 25 Aug 2011 05:08:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>图解kset,kobject,subsys</title>
		<link>http://hacktao.com/2011/08/25/356</link>
		<comments>http://hacktao.com/2011/08/25/356#comments</comments>
		<pubDate>Thu, 25 Aug 2011 05:07:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=356</guid>
		<description><![CDATA[   &#60;基于hacktao.com上的作品创作,转载请注明！&#62;          linux设备模型方面是驱动中比较高级的一块内容，对于刚开始学习驱动开发人员来说开始必须掌握驱动模型的编写框架和常用函数，当设备模型框架熟悉之后，就可以进入研究设备模型的实现。进入设备之前，我们必须搞清楚subsys，kset，kobject等概念。理清楚它们的结构，整个设备模型就了然了。               学习前的须知：        Linux设备模型的目的是：为内核建立起一个统一的设备模型，从而有一个对系统结构的一般性抽象描述。 现在内核使用设备模型支持多种不同的任务： 电源管理和系统关机 ：这些需要对系统结构的理解，设备模型使OS能以正确顺序遍历系统硬件。 与用户空间的通讯 ：sysfs 虚拟文件系统的实现与设备模型的紧密相关, 并向外界展示它所表述的结构。向用户空间提供系统信息、改变操作参数的接口正越来越多地通过 sysfs ， 也就是设备模型来完成。 热插拔设备 设备类型：设备模型包括了将设备分类的机制，在一个更高的功能层上描述这些设备, 并使设备对用户空间可见。 对象生命周期：设备模型的实现需要创建一系列机制来处理对象的生命周期、对象间的关系和对象在用户空间的表示。 Linux 设备模型是一个复杂的数据结构。但对模型的大部分来说, Linux 设备模型代码会处理好这些关系, 而不是把他们强加于驱动作者。模型隐藏于交互的背后，与设备模型的直接交互通常由总线级的逻辑和其他的内核子系统处理。所以许多驱动作者可完全忽略设备模型, 并相信设备模型能处理好他所负责的事。   参考资料： 《 Linux那些事儿 之 我是Sysfs》来源于复旦和交大三个牛人的Linux技术博客：http://blog.csdn.net/fudan_abc    （复旦_abc）他们还分析了很多Linux的驱动，很值得阅读。      进入正题，下面我们先上图大概了解下subsys，kset，kobject三者的关系：                                   图1：subsys，kset，kobject关系图      &#8230;<p class="read-more"><a href="http://hacktao.com/2011/08/25/356">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>   &lt;基于<a href="http://hacktao.com/">hacktao.com</a>上的作品创作,转载请注明！&gt;</p>
<p>         linux设备模型方面是驱动中比较高级的一块内容，对于刚开始学习驱动开发人员来说开始必须掌握驱动模型的编写框架和常用函数，当设备模型框架熟悉之后，就可以进入研究设备模型的实现。进入设备之前，我们必须搞清楚subsys，kset，kobject等概念。理清楚它们的结构，整个设备模型就了然了。</p>
<p>              学习前的须知：</p>
<p>       Linux设备模型的目的是：为内核建立起一个统一的设备模型，从而有一个对系统结构的一般性抽象描述。</p>
<p>现在内核使用设备模型支持多种不同的任务：<br />
电源管理和系统关机 ：这些需要对系统结构的理解，设备模型使OS能以正确顺序遍历系统硬件。</p>
<p>与用户空间的通讯 ：sysfs 虚拟文件系统的实现与设备模型的紧密相关, 并向外界展示它所表述的结构。向用户空间提供系统信息、改变操作参数的接口正越来越多地通过 sysfs ， 也就是设备模型来完成。</p>
<p>热插拔设备</p>
<p>设备类型：设备模型包括了将设备分类的机制，在一个更高的功能层上描述这些设备, 并使设备对用户空间可见。</p>
<p><span id="more-356"></span></p>
<p>对象生命周期：设备模型的实现需要创建一系列机制来处理对象的生命周期、对象间的关系和对象在用户空间的表示。</p>
<p>Linux 设备模型是一个复杂的数据结构。但对模型的大部分来说, Linux 设备模型代码会处理好这些关系, 而不是把他们强加于驱动作者。模型隐藏于交互的背后，与设备模型的直接交互通常由总线级的逻辑和其他的内核子系统处理。所以许多驱动作者可完全忽略设备模型, 并相信设备模型能处理好他所负责的事。</p>
<p>  参考资料：</p>
<p>《 Linux那些事儿 之 我是Sysfs》来源于复旦和交大三个牛人的Linux技术博客：<a href="http://blog.chinaunix.net/link.php?url=http://blog.csdn.net%2Ffudan_abc"><strong>http://blog.csdn.net/fudan_abc</strong></a>    （复旦_abc）他们还分析了很多Linux的驱动，很值得阅读。</p>
<p>     进入正题，下面我们先上图大概了解下subsys，kset，kobject三者的关系：</p>
<blockquote dir="ltr"><p>        <img src="http://hi.csdn.net/attachment/201108/25/0_1314248199B4d7.gif" alt="" /></p>
<blockquote dir="ltr">
<blockquote dir="ltr">
<blockquote dir="ltr">
<blockquote dir="ltr"><p>                          图1：subsys，kset，kobject关系图</p></blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p>     如图1所示：总线的subsys子系统通过链表list连接。Kset与所需的kobject集合也同样是链表相连接。关系图简单反映这3者得层次关系。为了更清楚说明这3者关系我们查看/sys下的目录结构（在设备模型中，设备驱动总线会反映在/sys目录下，这点不清楚参见上面的参考资料）：</p>
<p>补充资料：<br />
localhost:/sys#ls /sys/<br />
block/ bus/ class/ devices/ firmware/ kernel/ module/ power/<br />
Block目录：包含所有的块设备<br />
Devices目录：包含系统所有的设备，并根据设备挂接的总线类型组织成层次结构<br />
Bus目录：包含系统中所有的总线类型<br />
Drivers目录：包括内核中所有已注册的设备驱动程序<br />
Class目录：系统中的设备类型（如网卡设备，声卡设备等） </p>
<p>   下面图2是/sys目录下usb总线，设备，驱动的关系图:</p>
<p>                                        <img src="http://hi.csdn.net/attachment/201108/25/0_1314248334DDuR.gif" alt="" /></p>
<blockquote dir="ltr"><p>                                  图2  usb 总线，设备，驱动</p></blockquote>
<p>     总线上面有都有两条线，1.是drivers（驱动）2.devices（设备）。设备或者驱动加载都会注册加入对应的总线，并且这两者通过总线上能够匹配合适的驱动和设备。</p>
<p>     说了上面这些关于设备模型的概念我们在转回kset，kobject上面来。我们很多人学习设备模型都在考虑这么一个问题：kset，kobject这些是怎么将设备模型实现起来的呢，又是怎么个关系呢？好的带着这个疑问我们进入图3：</p>
<p>                                                                     <img src="http://hi.csdn.net/attachment/201108/25/0_13142483735Jbc.gif" alt="" /></p>
<p>                                                                                                           图3：设备与kset，kobject关系</p>
<p>     图3中第一层是sysfs文件系统的/sys目录；第二层是设备kset集合，通过链表将所有顶层kset链接起来。第三层是kobject集合，这些kobject通过链表与kset相连接，其中一种kset能够索引指向他的kobject。第四层是一个kobject里面的内容，包括资源属性等。</p>
<p>   图4更简单图片表示这些结构体的层次关系：</p>
<p>                                                                                <img src="http://hi.csdn.net/attachment/201108/25/0_1314248421U80t.gif" alt="" /></p>
<p>                                                                                      图4：设备模型的层次关系</p>
<p>上面我们已经从总体上浏览了设备模型的结构，下面进行更加细致分析各个结构的关系这里我引用网上一个文档说明：</p>
<p>1 <strong>Kobject</strong><br />
Kobject 是Linux 2.6引入的新的设备管理机制，在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口，kobject提供基本的对象管理，是构成Linux2.6设备模型的核心结构，它与sysfs文件系统紧密关联，每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结构。类似于C++中的基类，它嵌入于更大的对象的对象中&#8211;所谓的容器&#8211;用来描述设备模型的组件。如bus,devices, drivers 都是典型的容器。这些容器就是通过kobject连接起来了，形成了一个树状结构。这个树状结构就与/sys向对应。<br />
kobject 结构为一些大的数据结构和子系统提供了基本的对象管理，避免了类似机能的重复实现。这些机能包括<br />
- 对象引用计数.<br />
- 维护对象链表(集合).<br />
- 对象上锁.<br />
- 在用户空间的表示.</p>
<p>Kobject结构定义为：<br />
struct kobject {<br />
char * k name; 指向设备名称的指针<br />
char name[KOBJ NAME LEN]; 设备名称<br />
struct kref kref; 对象引用计数<br />
struct list head entry; 挂接到所在kset中去的单元<br />
struct kobject * parent; 指向父对象的指针<br />
struct kset * kset; 所属kset的指针<br />
struct kobj type * ktype; 指向其对象类型描述符的指针<br />
struct dentry * dentry; sysfs文件系统中与该对象对应的文件节点路径指针<br />
};<br />
其中的kref域表示该对象引用的计数，内核通过kref实现对象引用计数管理，内核提供两个函数kobject_get()、kobject_put()分别用于增加和减少引用计数，当引用计数为0时，所有该对象使用的资源释放。Ktype 域是一个指向kobj type结构的指针，表示该对象的类型。</p>
<p>相关函数<br />
void kobject_init(struct kobject * kobj)；kobject初始化函数。<br />
int kobject_set_name(struct kobject *kobj, const char *format, &#8230;)；设置指定kobject的名称。<br />
struct kobject *kobject_get(struct kobject *kobj)；将kobj 对象的引用计数加1，同时返回该对象的指针。<br />
void kobject_put(struct kobject * kobj)； 将kobj对象的引用计数减1，如果引用计数降为0，则调用kobject release()释放该kobject对象。<br />
int kobject_add(struct kobject * kobj)；将kobj对象加入Linux设备层次。挂接该kobject对象到kset的list链中，增加父目录各级kobject的引用计数，在其parent指向的目录下创建文件节点，并启动该类型内核对象的hotplug函数。<br />
int kobject_register(struct kobject * kobj)；kobject注册函数。通过调用kobject init()初始化kobj，再调用kobject_add()完成该内核对象的注册。<br />
void kobject_del(struct kobject * kobj)；从Linux设备层次(hierarchy)中删除kobj对象。<br />
void kobject_unregister(struct kobject * kobj)；kobject注销函数。与kobject register()相反，它首先调用kobject del从设备层次中删除该对象，再调用kobject put()减少该对象的引用计数，如果引用计数降为0，则释放kobject对象。<br />
<strong>§2 Kobj type</strong><br />
struct kobj_type {<br />
void (*release)(struct kobject *);<br />
struct sysfs_ops * sysfs_ops;<br />
struct attribute ** default_attrs;<br />
};<br />
Kobj type数据结构包含三个域：一个release方法用于释放kobject占用的资源；一个sysfs ops指针指向sysfs操作表和一个sysfs文件系统缺省属性列表。Sysfs操作表包括两个函数store()和show()。当用户态读取属性时，show()函数被调用，该函数编码指定属性值存入buffer中返回给用户态；而store()函数用于存储用户态传入的属性值。<br />
attribute<br />
struct attribute {<br />
char * name;<br />
struct module * owner;<br />
mode_t mode;<br />
};<br />
attribute, 属性。它以文件的形式输出到sysfs的目录当中。在kobject对应的目录下面。文件<br />
名就是name。文件读写的方法对应于kobj type中的sysfs ops。<br />
<strong>§3. kset</strong><br />
kset最重要的是建立上层(sub-system)和下层的(kobject)的关联性。kobject 也会利用它了分辨自已是属于那一個类型，然後在/sys 下建立正确的目录位置。而kset 的优先权比较高，kobject会利用自已的*kset 找到自已所属的kset，並把*ktype 指定成該kset下的ktype，除非沒有定义kset，才会用ktype來建立关系。Kobject通过kset组织成层次化的结构，kset是具有相同类型的kobject的集合，在内核中用kset数据结构表示，定义为：<br />
struct kset {<br />
struct subsystem * subsys; 所在的subsystem的指针<br />
struct kobj type * ktype; 指向该kset对象类型描述符的指针<br />
struct list head list; 用于连接该kset中所有kobject的链表头<br />
struct kobject kobj; 嵌入的kobject<br />
struct kset hotplug ops * hotplug ops; 指向热插拔操作表的指针<br />
};<br />
包含在kset中的所有kobject被组织成一个双向循环链表，list域正是该链表的头。Ktype域指向一个kobj type结构，被该kset中的所有kobject共享，表示这些对象的类型。Kset数据结构还内嵌了一个kobject对象（由kobj域表示），所有属于这个kset 的kobject对象的parent域均指向这个内嵌的对象。此外，kset还依赖于kobj维护引用计数：kset的引用计数实际上就是内嵌的kobject对象的引用计数。<br />
见图1，kset与kobject的关系图<br />
<img src="http://hi.csdn.net/attachment/201108/25/0_1314248640Knhb.gif" alt="" /></p>
<p>这幅图很经典，她反映了整个kobject的连接情况。</p>
<p>相关函数<br />
与kobject 相似，kset_init()完成指定kset的初始化，kset_get()和kset_put()分别增加和减少kset对象的引用计数。Kset_add()和kset_del()函数分别实现将指定keset对象加入设备层次和从其中删除；kset_register()函数完成kset的注册而kset_unregister()函数则完成kset的注销。</p>
<p><strong>§4 subsystem</strong><br />
如果說kset 是管理kobject 的集合，同理，subsystem 就是管理kset 的集合。它描述系统中某一类设备子系统，如block subsys表示所有的块设备，对应于sysfs文件系统中的block目录。类似的，devices subsys对应于sysfs中的devices目录，描述系统中所有的设备。Subsystem由struct subsystem数据结构描述，定义为：<br />
struct subsystem {<br />
struct kset kset; 内嵌的kset对象<br />
struct rw semaphore rwsem; 互斥访问信号量<br />
};</p>
<p>可以看出，subsystem与kset的区别就是多了一个信号量，所以在后来的代码中，subsystem已经完全被kset取缔了。</p>
<p>每个kset属于某个subsystem，通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量，用于同步访问kset中的链表。<br />
相关函数<br />
subsystem有一组类似的函数，分别是：<br />
void subsystem_init(struct subsystem *subsys);<br />
int subsystem_register(struct subsystem *subsys);<br />
void subsystem_unregister(struct subsystem *subsys);<br />
struct subsystem *subsys_get(struct subsystem *subsys)<br />
void subsys_put(struct subsystem *subsys);</p>
<p> 到这里我们就可以进入具体的函数进行分析。最后用一张图片来总结下这kobject，kset，subsys在设备模型中结构：</p>
<p>            <img src="http://hi.csdn.net/attachment/201108/25/0_1314248454i5Y5.gif" alt="" /></p>
<p>                                                                                                                           图5</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/08/25/356/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>利用Qt creator编写linux驱动</title>
		<link>http://hacktao.com/2011/08/24/349</link>
		<comments>http://hacktao.com/2011/08/24/349#comments</comments>
		<pubDate>Wed, 24 Aug 2011 13:12:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=349</guid>
		<description><![CDATA[利用Qt creator编写linux驱动        最近在潜心研究linux驱动开发，个人在这几天驱动开发中的遇到的几个难点： 开发工具不够智能 驱动代码庞大不知如何入手 硬件方面主要是电路方面知识欠缺           从这几个方面入手来解决开发linux驱动的难题。         在搜索引擎上我发现很多高手常用驱动的开发工具还是vi/vim，emacs。但是对于我用惯了集成开发环境工具的来说，使用vi感觉还是很别扭。由于自己常用Qt SDK开发环境。无意中使用QtCreator来编写驱动代码，发现QtCreator开发驱动也是很方便的。下面我简单介绍配置的过程： 1）  新建一个工程 2）  配置pro，加载内核代码头文件 INCLUDEPATH+=/lib/modules/2.6.38-8-generic/build/include（这里是内核头文件，这样实现智能代码提示）    3）  这样就能在qt creator上面实现智能提示，打开函数声明等。   这样一个开发环境就很好满足我本人对驱动开发的需求。]]></description>
			<content:encoded><![CDATA[<p><a href="http://hacktao.com/wp-content/uploads/2011/08/08241.jpg"></a>利用Qt creator编写linux驱动</p>
<p>       最近在潜心研究linux驱动开发，个人在这几天驱动开发中的遇到的几个难点：</p>
<ol>
<li>开发工具不够智能</li>
<li>驱动代码庞大不知如何入手</li>
<li>硬件方面主要是电路方面知识欠缺</li>
</ol>
<p> </p>
<p>        从这几个方面入手来解决开发linux驱动的<a href="http://hacktao.com/wp-content/uploads/2011/08/0824.jpg"></a>难题。</p>
<p>        在搜索引擎上我发现很多高手常用驱动的开发工具还是vi/vim，emacs。但是对于我用惯了集成开发环境工具的来说，使用vi感觉还是很别扭。由于自己常用Qt SDK开发环境。无意中使用QtCreator来编写驱动代码，发现QtCreator开发驱动也是很方便的。下面我简单介绍配置的过程：</p>
<p>1）  新建一个工程</p>
<p>2）  配置pro，加载内核代码头文件</p>
<p>INCLUDEPATH+=/lib/modules/2.6.38-8-generic/build/include（这里是内核头文件，这样实现智能代码提示）</p>
<p>  <a href="http://hacktao.com/wp-content/uploads/2011/08/08241.jpg"><img title="0824" src="http://hacktao.com/wp-content/uploads/2011/08/08241.jpg" alt="" width="989" height="367" /></a><a href="http://hacktao.com/wp-content/uploads/2011/08/0824.jpg"></a></p>
<p><a href="http://hacktao.com/wp-content/uploads/2011/08/0824.jpg"><span id="more-349"></span></a></p>
<p>3）  这样就能在qt creator上面实现智能提示，打开函数声明等。</p>
<p> <a href="http://hacktao.com/wp-content/uploads/2011/08/082411.jpg"><img class="alignnone size-full wp-image-352" title="08241" src="http://hacktao.com/wp-content/uploads/2011/08/082411.jpg" alt="" width="746" height="344" /></a></p>
<p>这样一个开发环境就很好满足我本人对驱动开发的需求。</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/08/24/349/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>坚持</title>
		<link>http://hacktao.com/2011/05/11/340</link>
		<comments>http://hacktao.com/2011/05/11/340#comments</comments>
		<pubDate>Wed, 11 May 2011 16:44:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[有感而发]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=340</guid>
		<description><![CDATA[活的太自在，容易飘起来，正如现在这个状态的我，以前过惯了自由自在，漫无目的的日子，导致遇到事情不容易坚持，容易放弃。 很长一段时间心理都处于一个不太平衡的状态下，抱怨重复而又单调的生活，抱怨在一个如同牢笼的日子里挣扎，不断在重复的工作上网这两件事情上，好像时钟永远在跳动。沉重的压迫对于我对于生活的无奈，我知道自己是少年不知愁滋味，有时候想想父辈们在田间面对毒辣的烈日，在饥饿中苦苦忍受，我觉得自己没有机会抱怨生活了。 说完了。]]></description>
			<content:encoded><![CDATA[<div>
<p>活的太自在，容易飘起来，正如现在这个状态的我，以前过惯了自由自在，漫无目的的日子，导致遇到事情不容易坚持，容易放弃。</p>
<p>很长一段时间心理都处于一个不太平衡的状态下，抱怨重复而又单调的生活，抱怨在一个如同牢笼的日子里挣扎，不断在重复的工作上网这两件事情上，好像时钟永远在跳动。沉重的压迫对于我对于生活的无奈，我知道自己是少年不知愁滋味，有时候想想父辈们在田间面对毒辣的烈日，在饥饿中苦苦忍受，我觉得自己没有机会抱怨生活了。</p>
<p>说完了。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/05/11/340/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>QT 2D绘图全面解析</title>
		<link>http://hacktao.com/2011/03/14/329</link>
		<comments>http://hacktao.com/2011/03/14/329#comments</comments>
		<pubDate>Mon, 14 Mar 2011 15:23:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[QT]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=329</guid>
		<description><![CDATA[Qt4中的2D绘图部分称为Arthur绘图系统.它由3个类支撑整个框架，QPainter,QPainterDevice和QPainterEngine.QPainter用来执行具体的绘图相关操作 如画点，画线，填充，变换，alpha通道等。QPainterDevice是QPainter用来绘图的绘图设备,Qt中有几种预定义的绘图设备，如QWidget,QPixamp,QPrinter等.他们都从QPaintDevice继承。QPaintEngine类提供了不同类型设备的接口，QPaintEngine对程序员不透明，由QPainter,QPaintDevice类与其进行交互。 从Qt4.2开始,Graphics View框架取代了QCanvas,QGraphics View框架使用了MVC模式，适合对大量2D图元的管理，Grphics View框架中，场景(scene)，存储了图形数据，它通过视图(view)以多种表现形式，每个图元(item)可以单独进行控制.Arthur绘图基础，在Arthur绘图框架中的基本绘图元素是画笔，画刷。QPainter类具有GUI程序需要的绝大多数函数,能够绘制基本图形(点，线，矩形，多边形等)以及复杂的图形(如绘图路径).使用绘图路径(QPaintPath)的优点是复杂形状的图形之用生成一次，以后再使用的时候是需要调用QPainter::drawPath()就可以了。QPainterPath对象可以用来填充，绘制轮廓。线和轮廓都可以用画笔(QPen)进行绘制，画刷(QBrush)进行填充。画笔定义了风格(线形),宽度，笔尖画刷以及端点是如何绘制的(cap-style),端点的连接方式(join-style).画刷用来填充画笔绘制的图形，可以定制不同的填充模式和颜色的画刷。当绘制文字时，字体使用QFont类定义，Qt使用指定字体的属性，如果没有匹配的字体，Qt将使用最接近的字体。字体属性可以通过QFontInfo来获取。字体的度量(measurement)使用QFontMetrics类来获取。QFontDatabase类可以获得底层窗口系统所有可用的字体. 通常情况下QPainter以默认的坐标系统进行绘制，也可以用QMatrix类对坐标进行变换。&#160; 当绘制时，可以使用QPainter::RenderHint来告诉绘图引擎是否启用饭锯齿功能使图变得平滑。 QPainter::RenderHint的可取如表6-1中的值 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; QPainter::Antialiasing           告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制 QPainter::TextAntialiasing       尽可能的情况下文字的反锯齿绘制 QPainter::SmoothPixmapTransform  使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法 QPainter的绘图函数 drawArc()                                 弧 drawChord()                               弦 drawConvexPolygon()                       凸多边形 drawEllipse()                             椭圆 drawImage()                               QImage表示的图像 drawLine()                                线 drawLines()                               多条线 drawPath()                                路径 drawPicture()                             按QPainter指令绘制 drawPie()                                 扇形 drawPixmap()                              QPixmap表示的图像 drawPoint()                               &#8230;<p class="read-more"><a href="http://hacktao.com/2011/03/14/329">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Qt4中的2D绘图部分称为Arthur绘图系统.它由3个类支撑整个框架，QPainter,QPainterDevice和QPainterEngine.QPainter用来执行具体的绘图相关操作 如画点，画线，填充，变换，alpha通道等。QPainterDevice是QPainter用来绘图的绘图设备,Qt中有几种预定义的绘图设备，如QWidget,QPixamp,QPrinter等.他们都从QPaintDevice继承。QPaintEngine类提供了不同类型设备的接口，QPaintEngine对程序员不透明，由QPainter,QPaintDevice类与其进行交互。</p>
<p>从Qt4.2开始,Graphics View框架取代了QCanvas,QGraphics View框架使用了MVC模式，适合对大量2D图元的管理，Grphics View框架中，场景(scene)，存储了图形数据，它通过视图(view)以多种表现形式，每个图元(item)可以单独进行控制.Arthur绘图基础，在Arthur绘图框架中的基本绘图元素是画笔，画刷。QPainter类具有GUI程序需要的绝大多数函数,能够绘制基本图形(点，线，矩形，多边形等)以及复杂的图形(如绘图路径).使用绘图路径(QPaintPath)的优点是复杂形状的图形之用生成一次，以后再使用的时候是需要调用QPainter::drawPath()就可以了。QPainterPath对象可以用来填充，绘制轮廓。线和轮廓都可以用画笔(QPen)进行绘制，画刷(QBrush)进行填充。画笔定义了风格(线形),宽度，笔尖画刷以及端点是如何绘制的(cap-style),端点的连接方式(join-style).画刷用来填充画笔绘制的图形，可以定制不同的填充模式和颜色的画刷。当绘制文字时，字体使用QFont类定义，Qt使用指定字体的属性，如果没有匹配的字体，Qt将使用最接近的字体。字体属性可以通过QFontInfo来获取。字体的度量(measurement)使用QFontMetrics类来获取。QFontDatabase类可以获得底层窗口系统所有可用的字体.</p>
<dt> <span id="more-329"></span> 通常情况下QPainter以默认的坐标系统进行绘制，也可以用QMatrix类对坐标进行变换。&nbsp;</p>
<p>当绘制时，可以使用QPainter::RenderHint来告诉绘图引擎是否启用饭锯齿功能使图变得平滑。</p>
<p>QPainter::RenderHint的可取如表6-1中的值</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>QPainter::Antialiasing           告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制</p>
<p>QPainter::TextAntialiasing       尽可能的情况下文字的反锯齿绘制</p>
<p>QPainter::SmoothPixmapTransform  使用平滑的pixmap变换算法(双线性插值算法),而不是近邻插值算法</p>
<p>QPainter的绘图函数</p>
<p>drawArc()                                 弧</p>
<p>drawChord()                               弦</p>
<p>drawConvexPolygon()                       凸多边形</p>
<p>drawEllipse()                             椭圆</p>
<p>drawImage()                               QImage表示的图像</p>
<p>drawLine()                                线</p>
<p>drawLines()                               多条线</p>
<p>drawPath()                                路径</p>
<p>drawPicture()                             按QPainter指令绘制</p>
<p>drawPie()                                 扇形</p>
<p>drawPixmap()                              QPixmap表示的图像</p>
<p>drawPoint()                               点</p>
<p>drawPoints()                              多个点</p>
<p>drawPolygon()                             多边形</p>
<p>drawPolyline()                            多折线</p>
<p>drawRect()                                矩形</p>
<p>drawRects()                               多个矩形</p>
<p>drawRoundRect()                           圆角矩形</p>
<p>drawText()                                文字</p>
<p>drawTiledPixmap()                         平铺图像</p>
<p>drawLineSegments()                        绘制折线</p>
<p>drawPicture()函数负责绘制QPicture中存储的QPainter指令，QPicture是可以记录QPainter绘图指令的类.它将QPainter的绘图指令串行化为平台无关的存储格式。</p>
<p>下面的代码将记录的绘图指令重绘。</p>
<p>QPicture picture;</p>
<p>picture.load(&#8220;mypicture.pic&#8221;);</p>
<p>QPainter painter(this);</p>
<p>painter.drawPicture(0,0,picture);//在(0,0)处重放绘图指令，也可以使用QPicture::play()完成相同的功能</p>
</dt>
<dd>&nbsp;</p>
<p>使用画笔</p>
<p>画笔的属性包括线型，线宽，颜色等。画笔的属性可以在构造函数中指定，也可以使用setStyle()，setWidth(),setBrush(),setCapStyle(),setJoinStyle()等函数</p>
<p>逐项设定画笔的各项属性.Qt中使用Qt::PenStyle定义了6种画笔风格，分别是Qt::SolidLine,Qt::DashLine,Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,</p>
<p>Qt::CustomDashLine.自定义线风格(Qt::CustomDashLine)，需要使用QPen的setDashPattern()函数来设定自定义风格.</p>
<p>下面代码设置了一个自定义QPen</p>
<p>QPen pen;</p>
<p>QVector customDashes;</p>
<p>qreal blank=4;</p>
<p>dashes&lt;&lt;2&lt; pen.setDashPattern(customDashes);</p>
<p>端点风格(cap style)</p>
<p>端点风格决定了线的端点样式，它只对线宽大于1的线有效。Qt种定义了三种端点风格用枚举类型Qt::PenCapStyle表示,分别为Qt::SqureCap,QT::FlatCap,Qt::RoundCap,</p>
<p>连接风格(Join style)</p>
<p>连接风格是两条线如何连接，连接风格对线宽大于等于1的线有效。Qt定义了四种连接方式用枚举类型Qt::PenStyle表示.分别是Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin.</p>
<p>Qt::SvgMiterJoin.</p>
<p>2.画刷</p>
<p>在Qt中图形使用QBrush进行填充，画刷包括填充颜色和风格(填充模式).在Qt中，颜色使用QColor类表示，QColor支持RGB,HSV,CMYK颜色模型。QColor还支持alpha混合的轮廓和</p>
<p>填充。基本模式填充包括有各种点，线组合的模式。Qt支持RGB,HSV,和CMYK颜色模型。RGB是面向硬件的模型。颜色由红绿蓝三种基色混合而成。HSV模型比较符合人对颜色的感觉，由</p>
<p>色调(0-359),饱和度(0-255),亮度(0-255)组成.CMYK由青，洋红，黄，黑四种基色组成。主要用于打印机等硬件拷贝设备上。每个颜色分量的取值是0-255.另外QColor还可以用</p>
<p>SVG1.0中定义的任何颜色名为参数初始化.</p>
<p>Qt4提供了渐变填充的画刷，渐变填充包括两个要素，颜色的变化和路径的变化。颜色变化可以指定从一种颜色渐变到另外一种颜色。也可以在变化的路径上指定一些点的颜色进行分段渐变。</p>
<p>Qt4中，提供了三种渐变填充：线性(QLinearGradient),圆形(QRadialGradient)和圆锥渐变(QConicalGradient).所有的类都从QGradient类继承.</p>
<p>－－－－－－－－－－－－－－－－－－</p>
<p>线性渐变填充</p>
<p>线性渐变填充指定两个控制点，画刷在两个控制点之间进行颜色插值。通过创建QLinearGradient对象来设置画刷.</p>
<p>QLinearGradient linearGradient(0,0,200,100);</p>
<p>linearGradient.setColorAt(0,Qt::red);</p>
<p>linearGradient.setColorAt(0.5,Qt::green);</p>
<p>linearGradient.setColorAt(1,Qt::blue);</p>
<p>painter.setBrush(linearGradient);</p>
<p>painter.drawRect(0,0,200,100);</p>
<p>在QGradient构造函数中指定线行填充的两点分别为(0,0),(100,100).setColorAt()函数在0-1之间设置指定位置的颜</p>
<p>圆形渐变填充</p>
<p>圆形渐变填充需要指定圆心，半径和焦点。画刷在焦点和圆上的所有点之间进行颜色插值。创建QRadialGradient对象设置画刷</p>
<p>QRadialGradient radialGradient(50,50,50,30,30);</p>
<p>radialGradient.setColorAt(0.2,Qt::cyan);</p>
<p>radialGradient.setColorAt(0.8,Qt::yellow);</p>
<p>radialGradient.setColorAt(1,Qt::magenta);</p>
<p>painter.setBrush(radialGradient);</p>
<p>painter.drawEllipse(0,0,100,100);</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>圆锥渐变填充</p>
<p>圆锥渐变填充指定圆心和开始角，画刷沿圆心逆时针对颜色进行插值，创建QConicalGradient对象并设置画刷.</p>
<p>QConicalGradient conicalGradient(60,40,30);</p>
<p>conicalGradient.setColorAt(0,Qt::gray);</p>
<p>conicalGradient.setColorAt(0.4,Qt::darkGreen);</p>
<p>conicalGradient.setColorAt(0.6,Qt::darkMagenta);</p>
<p>conicalGradient.setColorAt(1,Qt::drakBlue);</p>
<p>painter.setBrush(conicalGradient);</p>
<p>painter.drawEllipse(0,0,100,100);</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>为了实现自定义填充，还可以使用QPixmap或者QImage对象进行纹理填充。两种图像分别使用setTexture()和setTextureImage()函数加载纹理.</p>
<p>======================================================================================================================</p>
<p>双缓冲绘图</p>
<p>在Qt4中，所有的窗口部件默认都使用双缓冲进行绘图。使用双缓冲，可以减轻绘制的闪烁感。在有些情况下，用户要关闭双缓冲，自己管理绘图。下面的语句设置了窗口部件</p>
<p>的Qt::WA_PaintOnScreen属性 ，就关闭了窗口部件的双缓冲.</p>
<p>mywidget-&gt;setAttribute(Qt::WA_PaintOnScreen);</p>
<p>由于Qt4不再提供异或笔，组合模式QPainter::CompostionMode_Xor()并不是异或笔,Qt4只提供了QRubberBand实现矩形和直线的绘图反馈。因此要实现在绘图中动态</p>
<p>反馈必须使用其他方法。程序中使用双环冲来解决这个问题。在绘图过程中，一个缓冲区绘制临时内存，一个缓冲区保存绘制好的内容，最后进行合并。</p>
<p>在交互绘图过程中，程序将图像缓冲区复制到临时缓冲区，并在临时缓冲区上绘制，绘制完毕在将结果复制到图像缓冲区，如果没有交互复制，则直接将图像缓冲区绘制显示到屏幕上。</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>使用alpha通道</p>
<p>在windows,Mac OSX和有XRender扩展的X11系统上，Qt4能够支持Alpha通道，通过使用Alpha通道，可以实现半透明效果，QColor类中定义了Alpha通道的透明度，0表示完全透明</p>
<p>255表示完全不透明。注意QWidget类有一个属性windowOpacity,通过setWindowOpacity(qreal level)可以设置窗口的透明度。但该属性和Alpha通道的原理并不相同，Qt4在</p>
<p>Windows和Mac OS X平台上才支持该属性，但在X11平台上却需要Composite扩展才能工作。(alpha通道使用的是X11的xRender扩展).</p>
<p>绘图设备</p>
<p>QPaintDevice类是实际的绘制设备的基类.QPainter能够在QPaintDevice子类上进行绘制，如QWidget,QImage,QPixmap,QGLWidget,QGLPixelBuffer,QPicture,QPrinter</p>
<p>QSvgGenerator.要实现自己的绘图设备，必须从QPaintDevice类继承并实现其虚函数QPaintDevice::paintEngine()以告之QPainter能够在这个特定的设备上绘制图形，同时还需要从</p>
<p>QPaintEngine类继承自定义的图形绘制引擎。</p>
<p>1 QWidget</p>
<p>QWidget是所有用户界面元素的基类，窗口部件时用户界面的原子元素，他接受鼠标，键盘，窗口系统的其他事件并在屏幕上绘制自己。</p>
<p>2 QImage</p>
<p>QImage类提供了与硬件无关的图像表示，它为直接操作像素提供优化，QImage支持单色，8-bit,32-bit和alpha混合图像，使用QImage的优点在于可以获得平台无关的绘制操作，另外还有一个好处</p>
<p>时图像可以不必在GUI线程中处理。</p>
<p>3 QPixmap</p>
<p>QPixmap时后台显示的图像，它为在屏幕上显示图像提供优化，不同于QImage,pixmap的图像数据用户不可见，而且由底层窗口系统管理，为了优化QPixmap图像，Qt提供了QPixmapCache类来存储</p>
<p>临时的pixmap.Qt还提供了QPixmap的继承类QBitmap类，QBitmap表示单色的pixmap,主要用来创建自定义的QCursor和QBrush对象，构造QRegion对象，设置pixmap和窗口部件的掩码。</p>
<p>4 OPenGLWidget</p>
<p>Qt提供了QtOpenGL模块来实现OpenGL操作，QGLWidget允许使用OpenGL API进行绘制。同时QGLWidget时QWidget的子类，因此QPainter也可以在上面绘制。这样可以使Qt能够利用OpenGl</p>
<p>完成绘制操作，如变换和绘制pixmap</p>
<p>5 pixel Buffer</p>
<p>QGLPixelBuffer从QPaintDevice继承，封装了OpenGL pbuffer.使用pbuffer绘制通常时全硬件加速，这比使用QPixmap绘制更为迅速。</p>
<p>6 FrameBuffer</p>
<p>QGLFrameBufferObject从QPaintDevice继承，QGLFrameBufferObject封装了OpenGL frameBuffer对象，FrameBuffer对戏那个用来实现后台屏幕绘制，比pixel buffer更好一些。</p>
<p>7 picture</p>
<p>QPicture类时能够记录和重演QPainter命令的绘图设备，picture串行化painter的命令为平台无关的格式，QPicture同时也于分辨率无关，如QPicuture能够在不同的设备上(svg,pdf,ps</p>
<p>打印机和屏幕)有一只的显示。QPicture::load()和QPicture::save()函数分别完成载入和存储图像。</p>
<p>8 Printer</p>
<p>QPrinter 类时在打印机上绘制的绘图设备，在Windows和MAC OS  X上，QPrinter使用内建的打印机驱动程序，在X11上，QPrinter山城postscript代码并发送给lpr,lp或者其他打印程 序，QPrinter可以在任意其他QPrintEngine对象上打印，也可以直接生成PDF文件。</p>
<p>QPrintEngine类定义了QPrinter如何和其他打印机系统交互的接口，主要创建自己的打印引擎时，可以从QPaintEngine和QPaintEngine上继承。</p>
<p>======================================================================================================</p>
<p>坐标系统与坐标变换</p>
<p>1. Qt坐标系统由QPainter控制，同时也由  QPaintDevice和QPaintEngine类控制.QPaintDevice类是绘图设备的基 类，QWidget,QPixmap,QImage,和QPrinter都是QPaintDevice类的子类。Qt绘图设备默认坐标原点是左上角，X轴 向右增长，Y轴向下增长，默认的单位在基于像素的设备上是像素，在打印机设备上是1/72英寸(0.35毫米).QPainter的逻辑坐标与 QPainterDevice的物理坐标之间的映射由QPainter的变换矩阵，视口和窗口处理。逻辑坐标和物理坐标也是一直的。QPainter也支 持坐标变换(如旋转和伸缩);</p>
<p>2. 坐标变换。</p>
<p>通常QPainer在设备的坐标系统上绘制图形，但QPainter也支持坐标变换。可以通过QPainter::scale()函数进行比例变换。使用 QPainter::rotate()函数进行旋转变换。平移变换则使用QPainter::translate()函 数，QPainter::shear()函数对图形进行扭曲操作，所有变换操作的变换矩阵都可以通过QPainter::wordMatrix()函数取 出。不同的变换矩阵可以使用堆栈保存。</p>
<p>用QPainter::save()保存变换矩阵到堆栈，用QPainter::restore()函数将其弹出堆栈。</p>
<p>QMatrix定义了系统的二维变换。QMatrix对象实际上定义了一个3&#215;3矩阵。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>m11  m12  0</p>
<p>m21  m22  0</p>
<p>dx   dy   1</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>x\\&#8217;=m11*x+m21*y+dx;</p>
<p>y\\&#8217;=m22*y+m12*x+dy;</p>
<p>其中dx,dy表示水平和垂直偏移量，m11,m22表示水平和垂直方向上的比例。m12和m21表示水平和垂直方向上的扭曲程度。</p>
<p>矩阵可以通过setMatrix函数进行设置，然后可以使用translate(),rotate(),scale(),shear()等函数进行变 换.Qt4.3中引入QTransform类表示变换矩阵。与QMatrix不同的是，QTransform()支持透视变换。使用toAffine() 函数可以将QTransform对象转换为QMatrix对象。这将丢失QTransform的透视变换数据。逻辑坐标和物理坐标的变换由 QPainter的worldMatrix()函数。以及QPainter的viewport()和window()函数处理。视口表示物理坐标下的任意 矩形。而在窗口表示在逻辑坐标下的相同矩形。默认情况下逻辑坐标与物理坐标时相同的。与绘图设备上的矩形也是一致的。使用窗口－视口变换可以使逻辑坐标符 合自定义要求，这个机制通常用来完成设备无关的绘图代码。例如，可以设置逻辑坐标(-100,-100)到(100,100)且在原点(0,0),通过调 用QPainter::setWindow()函数可以完成下列操作。</p>
<p>QPainter painter(this);</p>
<p>painter.setWindow(QRect(-100,-100,200,200));</p>
<p>现 在，逻辑坐标的(-100,-100)对应着绘图设备的(0,0),这样可以绘制独立于设备，始终在指定逻辑坐标上工作。设置窗口或视口矩形实际上是执行 线性变换。本质上是窗口四个角映射到对应的视口四个角，反之亦然，因此保持视口和窗口x轴和y轴之间的比例变换一致，保证变换没有变形。窗口－视口变换只 是线性变换，不执行裁剪操作，例如当绘制超出窗口后，这些绘制仍然 通过线性变换映射到</p>
<p>视口进行绘制。Qt的绘制过程是进行坐标变换，在进行窗口－视口变换。</p>
<p>==================================================================================================================</p>
<p>使用不同的字体</p>
<p>Qt提供了Font类来表示字体，当创建QFont对象时，Qt会使用指定的字体，如果没有对应的字体，Qt将寻找一种最接近的已安装字体。字体信息可以通过</p>
<p>QFontInfo 取出，并可用QFontMetrics取得字体的相关数据。函数exactMatch()判断底层窗口系统中是否有完全对应的字体。使用 QApplication::setFont()可以设置应用程序默认的字体，如果选择的字体不包括所有要显示的字符，QFont将会尝试寻找最基接近的 字体。当QPainter绘制指定的字体中不存在的字符时</p>
<p>将绘制一个空心的正方行。</p>
<p>绘图路径  &#8211;QPainterPath</p>
<p>绘图路径(painter path)由基本图元(矩形，椭圆，直线，曲线)组成，绘图路径可以是闭合的路径，如矩形和圆，或者是非闭合的路径，如直线和曲线。绘图路径在Qt中使用QPainterPth类表示，</p>
<p>它提供了绘图操作的容器，可以使图形能够复用。绘图路径可以进行填充，显示轮廓和裁剪。要生成可填充的轮廓的绘图路径，可以使用QPainterPathStroker类.使用QPainterPath的优点是复杂的</p>
<p>图形只需创建一次，就可以多次使用。QPainterPath对象可以时只有起点的空路径，或者从其他QPainterPath对象复制，创建了QPainterPath对象后，可以使用lineTo(),cubicTo(),</p>
<p>quadTo() 函数将直线和曲线添加到路径中来，直线和曲线从currentPosition()开始绘制。currentPosition()总是返回最后的子路经绘 制的终点。使用moveTo()函数可以在不增加路径的情况下移动currentPositon(),它关闭了一个子路经，开始一个新的子路经。 closeSubPath()也可以关闭当前路径，并从currentPosition()连接一条直线到绘图路径的起点。QPainter可以使用 addEllipse(),addPath(),addRect(),addRegion(),addText()将Qt的一些基本图元加入绘图路径。一 个已有的绘图路径可以通过connectPath()函数加入到另一个绘图路径中。</p>
<p>如下代码绘制了一个箭头:</p>
<p>QPainterPath path;</p>
<p>path.moveTo(10,100);</p>
<p>path.cubicTo(10,100,100,10,200,70);</p>
<p>path.lineTo(200,50);</p>
<p>path.lineTo(220,80);</p>
<p>path.lineTo(200,110);</p>
<p>path.lineTo(200,90);</p>
<p>path.cuticTo(200,100,100,50,50,100);</p>
<p>QPainter painter(this);</p>
<p>QPen pen(QColor(255,0,0),2);</p>
<p>painter.setPen(pen);</p>
<p>painter.drawPath(path);</p>
<p>Qt提供了两种填充方式，Qt::OddEventFill和 Qt::WindingFill.Qt::OddEvent时默认的填充规则，它指定QPainterPath使用奇偶填充规则，该规则判断一个点是否在 论经图形内的方法是从该店画一条水平线到路径外，计算水平线和路径的交点数，如果交点时奇数个则说明该点在路径图形内。QPainterPath还有一些 函数可以获取路径信息，如elementAt()函数可以取出指定的子路经元素，</p>
<p>isEmpty()函数判断当前路径是否为空。 controlPointRect()函数返回路径中所有的点和控制点的矩形，该函数运行速度比返回精确包容框boundingRect()函数快得多。 contains()函数判断一个点或一个矩形是否在路径内。intersects()判断指定的矩形与路径是否相交.QPainterPath可以将矩 形图形转换为其他图形，如使用toFillPolygon（）,toFillPolygon(),toSubpathPOlygons()函数将路径转化 为多边形。</p>
<p>QPainterPath还可以使用文字作为路径，下面的代码演示了文字路径，并使用线性渐变填充。</p>
<p>QLinearGradient linearGrad(QPointF(200,0),QPointF(1000,0));</p>
<p>linearGrad.setColorAt(0,Qt::black);</p>
<p>linearGrad.setColorAt(1,Qt::white);</p>
<p>QFont font(&#8220;隶书&#8221;,80);</p>
<p>font.setBold(true);</p>
<p>QPainterPath textPath();</p>
<p>textPath.addText(200,300,font,tr(&#8220;电子工业出版社&#8221;));</p>
<p>painter.setBrush(linearGrad);</p>
<p>painter.drawPath(textPath);</p>
<p>===========================================================================</p>
<p>QImage和QPixmap绘图设备</p>
<p>Qt 提供了4个处理图像的类。QImage,QPixmap,QBitmap,QPicure.他们有着各自的特点。QImage优化了I/O操作，可以直接 存取操作像素数据。QPixmap主要用来在屏幕上显示图像。QBitmap从QPixmap继承，只能表示两种颜色，QPicture是可以记录和重放 QPrinter命令的类。QImage提供了与硬件无关的图像表示方法。通过QImage可以直接存取像素数据，QImage也可以用作绘图设备。</p>
<p>QImage 支持的图像颜色可以是单色，8位，32位和alpha混合的格式。因为QImage从QPainterDevice继承，所以QPainter可以直接在 QImage上绘图。除了绘制文字格式外(QFont依赖于底层的GUI).其他的绘制操作可以在任意线程中完成，如果要在其他线程中绘制文字，可以使用 QPainterPath。QImage对象具有隐式共享，作为传值参数，可以使用数据流及进行比较等特性。</p>
<p>读入图像可以通过QImage构造函 数，load(),loadFromData()几种方法完成。还可以通过QImage的静态函数fromData()由指定数据构造一个QImage对 象。既可以从文件系统装入，也可以从Qt应用程序的嵌入式资源中读取，使用save()可以保存QImage对象。可以通过 QImageReader::supportedImageFormats()和 QImageWriter::supportedImageFormats()获取QImage支持的所有文件格式列表。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>QImage函数</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>几何函数   size(),widt(),dotsPermeterX(),dotsPerMeterY()函数获取图像大小和比例信息。</p>
<p>rect()函数返回图像的包容矩形，valid()测试给定的坐标是否在此矩形内。offset()获取图像和其他图像之间的相对偏移量。setOffset()函数设置偏移量。</p>
<p>颜色函数   某个像素的颜色可以通过pixel函数获取，返回值是QRgb类型，对于单色和256色图像，colorTable()返回调色板,numColors返回调色板中的条目数.用pixelIndex()</p>
<p>函数获取像素的颜色索引，然后使用color()函数取出实际的颜色值.hasAlphaChannel()函数返回图像是否使用了alpha通道。allGray(),isGrayscale()测试图像是否为灰度图像。</p>
<p>文字        text()函数返回图像附属的文字，textKeys()返回文字的键值表。setText()函数改变图像附属文字.</p>
<p>低级信息   depth()函数获取图像颜色位数.支持1,8,32位.format().bytesPerLine()和numBytes()函数返回图像的数据存储信息.serieralNumber()函数取得唯一标识QImage对象的数字.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>QImage的8位和单色图像采用颜色索引表的方式存取，32为的图像则直接存储ARGB值.因此他们的像素操作函数也不相同，对32位的图像，setPixel()函数可以改变指定像素的QRgb颜色值，对8位和</p>
<p>单 色图像，setPixel()改变在预定义颜色表中的索引值，如果要改变颜色表，可以使用setColor()函数。QImage提供 scanLine()函数返回指定行的数据。bits()函数返回第一个像素的指针。每个像素在QImage中都使用整数形式表示。单色图像使用一位的索 引指向只有两种颜色的调色板，有两种类型的单色图像，big endia(MSB),little  endian(LSB).256色图像使用8位颜色调色板，调色板的数据类型是QVector,QRgb实际上时无符号整数型，存储ARGB 的格式是0xAARRGGBB.32位的图像直接存储，有三种类型的存储格式：RGB,ARGB和已预乘的ARGB。在已预乘ARGB中，红绿蓝三色已经 和alpha相乘并模除255.allGray()和isGrayscale()函数可以判断一个彩色图像能否安全转化为灰度图像。图像的格式用 format()函数读取出，convertToFormat()可以进行图像格式转化，QImage支持的存储格式如下:</p>
<p>QImage::Format_Mono            单色图像(MSB)</p>
<p>QImage::Format_MonoLSB         单色图像(LSB)</p>
<p>QImage::Format_Indexed8        使用颜色表的256色图像</p>
<p>QImage::Format_RGB32           不支持Alpha通道的32位图像</p>
<p>QImage::FOrmat_ARGB32          含Alpha通道的32位图像</p>
<p>QImage::Format_ARGB32_Premultiplied   已预乘的含Alpha通道的32位图像.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>QPixmap</p>
<p>QPixmap 主要完成屏幕后台(off-screen)缓冲区绘图。QPixmap对象可以使用QLabel或QAbstractButton子类 (QPushButton,QToolButton)显示,QLabel通过设置pixmap属性，QAbstractButton通过设置icon属性 来完成，除了使用构造函数初始化，QPixmap对象还可以使用静态函数grabWidget()和grabWindow()函数创建，并绘制指定的窗口 和窗口部件.QPixmap中的像素数据时内部的，并且由底层的窗口系统进行管理，如果要存取像素，只有通过QPrinter函数将QPixmap对戏那 个转换为QImage对象，根据底层系统的不同，QPixmap可以RGB32或者混合alpha格式存储，如果图像有Alpha通道且底层系统允许，则 优先使用混合alpha格式，因此QPixmap时依赖于底层系统的，在X11上和Mac上，QPixmap存储在服务器端,QImage存储在客户点， 在windows上，这两个类表达方式时相同的。QImage和QPixmap可以相互转换，通常QImage载入图像并进行直接操作，然后转换为 QPixmap在屏幕上显示。如果不需要操作像素，就直接使用QPixmap.在windows上，QPixmap还可以与HBITMAP之间相互转 换，QPixmap和QImage一样使用隐式共享，也能够使用数据流。</p>
<p>=======================================================================================================</p>
<p>组合模式绘图</p>
<p>组 合模式(Composition  Mode)用来指定如何合并源图像和一个图像，最常见的是SourceOver(通常也叫alpha混合),当原像素和目标像素以这种方式混合时，源图像 的alpha通道定义了像素的透明度。组合模式绘图只支持Format_ARGB32_Premultiplied和Format_ARGB32格格式， 而且应该优先使用Format_ARGB32_Premultiplied格式，设置了组合模式后，它对所有的绘图操作都有效，如画笔，画刷，渐变效果和 pixmap/image绘制。QPainter::CompositeMode枚举类型中前12中组合类型是T.Porter和T.Duff于1984 年在沦为(Compositing Digital  Image)中阐明的12种混合规则(Porter-Duff规则)混合的计算方法在此给出。以便理解混合的过程。</p>
<p>首先定义混合的因子 :</p>
<p>As:       原像素的alpha分量</p>
<p>Cs:       原像素种计算好(premultiplied)色彩分量</p>
<p>Ad:       目标像素的alpha分量</p>
<p>Cd;       目标像素计算好的色彩分量</p>
<p>Fs:       原像素在输出结果种占有的比例</p>
<p>Fd:       目标像素在输出结果种占有的比例</p>
<p>Ar:       输出结果种的Alpha分量</p>
<p>Cr:       输出结果种计算好的色彩分量</p>
<p>Porter和Duff定义了选择混合因子Fs和Fd产生不同的视觉效果的12种规则，最终结果种的Alpha值和色彩值由下面的公式决定</p>
<p>Fs=f(Ad);</p>
<p>Fd=f(As);</p>
<p>Ar=AsxFs+AdxFd</p>
<p>Cr=CsxFs+CdxFd</p>
<p>每种类型的Fs和Fd取值如表所示</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>常 量                                             Fs        Fd              说明</p>
<p>QPainter::CompositionMode_SourceOver            1        1-As         默认模式，源alpha和目标像素混合</p>
<p>QPainter::CompositionMode_DestinationOver       1-Ad       1          和SourceOver相反，目标Alpha和源像素混合</p>
<p>QPainter::CompositionMode_Clear                 N/A       N/A         清除目标像素</p>
<p>QPainter::CompositionMode_Source                N/A       N/A         输出源像素</p>
<p>QPainter::CompositionMode_SourceIn              Ad        0           在目标部分的源替代目标</p>
<p>QPainter::CompositionMode_DestinationI          0         As          于SourceIn相反</p>
<p>QPainter::CompositionMode_SourceOut             1-Ad      0           在目标之外的源替代目标</p>
<p>QPainter::CompositionMode_DestinationOut        0         1-As        于SourceOut相反</p>
<p>Qpainter::CompositionMode_SourceAtop            Ad        1-As        在目标部分的源和目标组合</p>
<p>QPainter::CompositionMode_DestinationAtop       1-Ad      As          与sourceatop相反</p>
<p>QPainter::CompositionMode_Xor                   1-Ad      1-As        在目标之外的源和源之外的目标混合</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>注意，上面的说明并没有完全概括各种混合的含义，要准确理解他们可以看公式并进行实践，畜类上面12种Porter_Duff规则外，Qt还支持12种扩展混合模式。下面给出计算公式需要注意如果结果中alpha值和色彩值超过0-255的范围，数值将会被截断</p>
<p>1  QPainter::CompositionMode_Plus           源和目标相加，该操作实现动画中两幅图像的溶解和过度过程。Cr=Cs+Cd   Ar=As+Ad</p>
<p>2  QPainter::CompositionMode_Multiply       源和目标进行正片叠底(multiply)操作。结果的颜色至少是源和目标种较暗的颜色。任何颜色和黑色作该操作产生黑色。任何颜色和白色作</p>
<p>该操作将不会改变。Cr=CsxCd+Csx(1-Ad)+Cdx(1-As)   Ar=AsxAd+Asx(1-Ad)+Adx(1-As)=As+Ad-AsxAd</p>
<p>3  QPainter::CompositionMode_Screen         源和目标互补然后相乘结果的颜色至少是源和目标种较亮的颜色。任何颜色和黑色进行滤色操作不会改变，任何颜色和白色进行滤色操</p>
<p>作还是白色</p>
<p>4  QPainter::CompositionMode_Overlay        根据目标颜色值不同，进行相乘操作或滤色操作，源色彩保持亮度和阴影覆盖在目标上。目标颜色和源颜色混合以反应目标的亮度。</p>
<p>5  QPainter::CompositionMode_Darken         选择源和目标种较暗的颜色</p>
<p>6  QPainter::CompositionMode_Lighten        选择源和目标种较亮的颜色</p>
<p>7  QPainter::CompositoinMode_ColorDodge     加亮目标颜色以反应源颜色，绘制黑色将没有效果</p>
<p>8  QPainter::CompositionMode_ColorBurn      使目标颜色变暗以反应源颜色，绘制白色没有效果。</p>
<p>9  QPainter::CompositionMode_HardLight      根据源的颜色，决定是正片叠底还是滤色操作。如果源颜色高于0.5，目标颜色将变亮。即进行滤色操作。如果源颜色亮度值低于0.5，目标将</p>
<p>会变暗，相当于进行了正片叠底操作。如果源亮度值等于0.5，目标不会改变，变亮或者变暗成都取决于源颜色和0.5的差，绘制纯黑色和纯白</p>
<p>色结果还是纯黑或纯白。</p>
<p>10 QPainter::CompositionMode_SoftLight      根据源的颜色，决定进行变暗(darken)操作还是变亮(lighten)操作。如果源颜色比0.5亮，目标将变亮，即进行了滤色操作。如果源颜色</p>
<p>比0.5暗，目标将变暗，相当于进行了颜色加深(burn)操作,如果等于0.5.目标不会发生改变。变亮或者变暗的程度取决于源颜色和0.5的差</p>
<p>值。</p>
<p>11  QPainter::CompositionMode_Difference      源和目标种较暗的颜色减去较亮的颜色，绘制导致白色反转成目标颜色黑色没 化</p>
<p>12 Qpainter::CompositionMode_Exclusion      和上一条规则的效果类似，但对比对较低一些，绘制白色将导致反转成目标颜色，绘制黑色没有</p>
</dd>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/03/14/329/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt实现遍历文件夹和文件目录（递归）</title>
		<link>http://hacktao.com/2011/03/10/315</link>
		<comments>http://hacktao.com/2011/03/10/315#comments</comments>
		<pubDate>Thu, 10 Mar 2011 11:11:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开博导言]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=315</guid>
		<description><![CDATA[Qt实现遍历文件夹和文件目录（递归） bool FindFile(const QString &#38; path) { QDir dir(path); if (!dir.exists()) return false; dir.setFilter(QDir::Dirs&#124;QDir::Files); dir.setSorting(QDir::DirsFirst); QFileInfoList list = dir.entryInfoList(); int i=0; do{ QFileInfo fileInfo = list.at(i); if(fileInfo.fileName()==&#8221;.&#8221;&#124;fileInfo.fileName()==&#8221;..&#8221;) { i++; continue; } bool bisDir=fileInfo.isDir(); if(bisDir) { nFiles++; std::cout &#60;&#60; qPrintable(QString(&#8220;%1 %2 &#8230;<p class="read-more"><a href="http://hacktao.com/2011/03/10/315">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Qt实现遍历文件夹和文件目录（递归）</p>
<div id="blog_text">
<p>bool FindFile(const QString &amp; path)<br />
{<br />
QDir dir(path);<br />
if (!dir.exists())<br />
return false;<br />
dir.setFilter(QDir::Dirs|QDir::Files);<br />
dir.setSorting(QDir::DirsFirst);<br />
QFileInfoList list = dir.entryInfoList();<br />
int i=0;<br />
do{</p>
<p>QFileInfo fileInfo = list.at(i);<br />
if(fileInfo.fileName()==&#8221;.&#8221;|fileInfo.fileName()==&#8221;..&#8221;)<br />
{<br />
i++;<br />
continue;<br />
}<br />
bool  bisDir=fileInfo.isDir();<br />
if(bisDir)<br />
{<br />
nFiles++;<br />
std::cout &lt;&lt; qPrintable(QString(&#8220;%1 %2 %3&#8243;).arg(fileInfo.size(), 10)<br />
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))&lt;&lt;endl;</p>
<p>FindFile(fileInfo.filePath());<br />
}<br />
else{<br />
nFiles++;<br />
std::cout &lt;&lt; qPrintable(QString(&#8220;%1 %2 %3&#8243;).arg(fileInfo.size(), 10)<br />
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))&lt;&lt;endl;<br />
}<br />
<span id="more-315"></span> i++;<br />
}while(i&lt;list.size());<br />
return true;<br />
}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/03/10/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>推荐两个在线图片编辑网站,可以不用装photoshop了</title>
		<link>http://hacktao.com/2011/03/04/310</link>
		<comments>http://hacktao.com/2011/03/04/310#comments</comments>
		<pubDate>Fri, 04 Mar 2011 05:02:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=310</guid>
		<description><![CDATA[1、悠悠泡泡图片编辑器 网址：http://www.uupoop.com/ 中文界面，简单易用，其中的“在线 PS 图片”与 Photoshop 有几分类似 技巧：若感觉操作界面不够大，按下 F11 可使浏览器全屏 附件: ps在线版 Photoshop在线精简版 &#8211; Mozilla Firefox_004.png [ 395.26 KiB &#124; 被浏览 326 次 ] 附件: 在线图片编辑器.png [ 386.15 KiB &#124; 被浏览 325 次 ] 2、Sumo Paint 网址：http://www.sumopaint.com/app/ 如果第一个网站还不能满足您 PS 的要求，此处是不错的选择，英文界面、功能强大，看起来更像 &#8230;<p class="read-more"><a href="http://hacktao.com/2011/03/04/310">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<div>1、悠悠泡泡图片编辑器<br />
网址：<a href="http://www.uupoop.com/">http://www.uupoop.com/</a><br />
中文界面，简单易用，其中的“在线 PS 图片”与 Photoshop 有几分类似<br />
技巧：若感觉操作界面不够大，按下 F11 可使浏览器全屏</p>
<div>附件:</div>
<div><a onclick="return hs.expand(this)" href="http://forum.ubuntu.org.cn/download/file.php?id=110690&amp;sid=a6cfaa553ebf32c4f80795bd258f7223&amp;mode=view/ps%E5%9C%A8%E7%BA%BF%E7%89%88%20Photoshop%E5%9C%A8%E7%BA%BF%E7%B2%BE%E7%AE%80%E7%89%88%20-%20Mozilla%20Firefox_004.png"><img title="Click to enlarge" src="http://forum.ubuntu.org.cn/download/file.php?id=110690&amp;t=1&amp;sid=a6cfaa553ebf32c4f80795bd258f7223" alt="ps在线版 Photoshop在线精简版 - Mozilla Firefox_004.png" /></a><br />
ps在线版 Photoshop在线精简版 &#8211; Mozilla Firefox_004.png [ 395.26 KiB | 被浏览 326 次 ]</p>
</div>
<div>附件:</div>
<div><a onclick="return hs.expand(this)" href="http://forum.ubuntu.org.cn/download/file.php?id=110692&amp;sid=a6cfaa553ebf32c4f80795bd258f7223&amp;mode=view/%E5%9C%A8%E7%BA%BF%E5%9B%BE%E7%89%87%E7%BC%96%E8%BE%91%E5%99%A8.png"><img title="Click to enlarge" src="http://forum.ubuntu.org.cn/download/file.php?id=110692&amp;t=1&amp;sid=a6cfaa553ebf32c4f80795bd258f7223" alt="在线图片编辑器.png" /></a><br />
在线图片编辑器.png [ 386.15 KiB | 被浏览 325 次 ]</p>
</div>
<p>2、Sumo Paint<br />
网址：<a href="http://www.sumopaint.com/app/">http://www.sumopaint.com/app/</a><br />
如果第一个网站还不能满足您 PS 的要求，此处是不错的选择，英文界面、功能强大，看起来更像 Photoshop 了～</p>
<div>附件:</div>
<div><a onclick="return hs.expand(this)" href="http://forum.ubuntu.org.cn/download/file.php?id=110691&amp;sid=a6cfaa553ebf32c4f80795bd258f7223&amp;mode=view/Sumo%20Paint%202.0.png"><img title="Click to enlarge" src="http://forum.ubuntu.org.cn/download/file.php?id=110691&amp;t=1&amp;sid=a6cfaa553ebf32c4f80795bd258f7223" alt="Sumo Paint 2.0.png" /></a><br />
Sumo Paint 2.0.png [ 183.93 KiB | 被浏览 326 次 ]</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/03/04/310/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>qt捕捉应用程序空闲状态</title>
		<link>http://hacktao.com/2011/03/02/307</link>
		<comments>http://hacktao.com/2011/03/02/307#comments</comments>
		<pubDate>Wed, 02 Mar 2011 14:44:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开博导言]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=307</guid>
		<description><![CDATA[利用QCoreApplication 类中的hasPendingEvents方法。 该方法在程序当程序处理事件是返回true，否则返回false。 因为我程序新建窗口比较多，为了提高程序启动速度，故想在讲窗口创建放在程序闲暇时候。则在 某一个类中处理如下 在BootWindow类的构造函数中起一个定时器 setTimer(2); 实现： void BootWindow::timerEvent(QTimerEvent *event) { if(QCoreApplication::hasPendingEvents()==false){ 这里可以写你需要的处理的事件 处理完后 killTimer( event-&#62;timerId()); } 这里我们就可以加速程序处理了。利用程序闲暇时间来处理重要的事情。]]></description>
			<content:encoded><![CDATA[<p>利用QCoreApplication 类中的hasPendingEvents方法。</p>
<p>该方法在程序当程序处理事件是返回true，否则返回false。</p>
<p>因为我程序新建窗口比较多，为了提高程序启动速度，故想在讲窗口创建放在程序闲暇时候。则在</p>
<p>某一个类中处理如下</p>
<p>在BootWindow类的构造函数中起一个定时器</p>
<p>setTimer(2);</p>
<p>实现：</p>
<p>void BootWindow::timerEvent(QTimerEvent *event)<br />
{</p>
<p>if(QCoreApplication::hasPendingEvents()==false){</p>
<p>这里可以写你需要的处理的事件</p>
<p>处理完后</p>
<p>killTimer( event-&gt;timerId());</p>
<p>}</p>
<p>这里我们就可以加速程序处理了。利用程序闲暇时间来处理重要的事情。</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2011/03/02/307/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KScope ubuntu ./configure 错误</title>
		<link>http://hacktao.com/2010/12/09/305</link>
		<comments>http://hacktao.com/2010/12/09/305#comments</comments>
		<pubDate>Thu, 09 Dec 2010 10:56:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[嵌入式linux]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=305</guid>
		<description><![CDATA[之前UBUNTU8.04安裝KSCOPE時, 直接用APT-GET的指令即可 但安裝9.10的就不能這樣用了(不知道為什麼), 直 接手動安裝吧 下載KSCOPE的程式下來裝吧 http://sourceforge.net/projects/kscope/files/ 聴 說新版的不好用,所以就下載1.6.2版的,這好像是1.9之前的最終版 下載完成後解壓 tar zxvf kscope-1.6.2.tar.gz cd kscope-1.6.2 執行 ./configure 結果如下 checking build system type&#8230; i686-pc-linux-gnu checking host system type&#8230; i686-pc-linux-gnu checking target system type&#8230; i686-pc-linux-gnu checking for a BSD-compatible install&#8230; /usr/bin/install -c &#8230;<p class="read-more"><a href="http://hacktao.com/2010/12/09/305">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>之前UBUNTU8.04安裝KSCOPE時,<br />
直接用APT-GET的指令即可<br />
但安裝9.10的就不能這樣用了(不知道為什麼),</p>
<p>直 接手動安裝吧</p>
<p>下載KSCOPE的程式下來裝吧</p>
<p>http://sourceforge.net/projects/kscope/files/</p>
<p>聴 說新版的不好用,所以就下載1.6.2版的,這好像是1.9之前的最終版</p>
<p>下載完成後解壓<br />
tar zxvf  kscope-1.6.2.tar.gz</p>
<p>cd kscope-1.6.2</p>
<p>執行 ./configure<br />
結果如下<br />
checking  build system type&#8230; i686-pc-linux-gnu<br />
checking host system type&#8230;  i686-pc-linux-gnu<br />
checking target system type&#8230; i686-pc-linux-gnu<br />
checking  for a BSD-compatible install&#8230; /usr/bin/install -c<br />
checking for -p  flag to install&#8230; yes<br />
checking whether build environment is sane&#8230;  yes<br />
checking for a thread-safe mkdir -p&#8230; /bin/mkdir -p<br />
checking  for gawk&#8230; no<br />
checking for mawk&#8230; mawk<br />
checking whether make  sets $(MAKE)&#8230; yes<br />
checking for kde-config&#8230; not found<br />
configure: error: The important  program kde-config was not found!<br />
Please check whether you installed  KDE correctly.<br />
最後兩行有個錯誤訊息<br />
那是因為少了kdelibs4c2a這個套件<br />
直接 sudo apt-get install kdelibs4c2a安裝即可<br />
這套件安裝的時間有點久&#8230;&#8230;.<br />
主要是因為我不知道國 內映射檔的網址<br />
所以要下載很久</p>
<p>2.</p>
<p><em><strong>sudo aptitude  install build-essential</strong> </em></p>
<p>this will download and install the essential lib that is build  related, such as gcc g++</p>
<p>but that is  for other Linux distribution system, my is Ubuntu, so we should install  the needed libs</p>
<p>sudo  aptitude install build-essential</p>
<p>this will  download and install the essential lib that is build related, such as  gcc g++ &#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2010/12/09/305/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习学习！</title>
		<link>http://hacktao.com/2010/10/13/303</link>
		<comments>http://hacktao.com/2010/10/13/303#comments</comments>
		<pubDate>Wed, 13 Oct 2010 14:41:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[有感而发]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=303</guid>
		<description><![CDATA[出来工作了，才发现学校学的东西太少了。很多东西得自己去悟。没有人指导，我总想认识些高手， 能告诉我我在这个时候需要学那些，需要做那些。 我很浮躁，到现在了，我这个老毛病还是这样，总想着要去做一些事，但是总找到不时间或者浪费时间 去做另一个更浪费时间的事。 就拿学英文来说，我是迫切的想掌握好这个工具。看到并发现它的实用，我总在说要学好这个，到了现在 一直都没去认真去履行这件事。 现在不想学校那样轻松了。天天上班，下班回来聊聊天，一天就这么过去了。人生就是这么匆匆而过。 正如我感叹这时间过的，总是觉得生命应该精彩一点。但真的现实中发现我自己被老多东西束缚了。我動 不起来了，我喜欢早晨初生的太阳，我是那样的想呼吸那清新的空气，喜欢闻闻阳光的香味。喜欢有点凉飕飕的 感觉。 一切都好像很平常。忽然感觉自己这段时间的心态不太好。脸色也不好。心情也没有那么好了。 什么理想抱负，什么狗屁金钱爱情。 现在我想认真看看书。最近发现很多好书。以前要是好好看看多好。 明天是否来临？我要早起去看初生的阳光。]]></description>
			<content:encoded><![CDATA[<p>出来工作了，才发现学校学的东西太少了。很多东西得自己去悟。没有人指导，我总想认识些高手，</p>
<p>能告诉我我在这个时候需要学那些，需要做那些。</p>
<p>我很浮躁，到现在了，我这个老毛病还是这样，总想着要去做一些事，但是总找到不时间或者浪费时间</p>
<p>去做另一个更浪费时间的事。<br />
就拿学英文来说，我是迫切的想掌握好这个工具。看到并发现它的实用，我总在说要学好这个，到了现在</p>
<p>一直都没去认真去履行这件事。</p>
<p>现在不想学校那样轻松了。天天上班，下班回来聊聊天，一天就这么过去了。人生就是这么匆匆而过。</p>
<p>正如我感叹这时间过的，总是觉得生命应该精彩一点。但真的现实中发现我自己被老多东西束缚了。我動</p>
<p>不起来了，我喜欢早晨初生的太阳，我是那样的想呼吸那清新的空气，喜欢闻闻阳光的香味。喜欢有点凉飕飕的</p>
<p>感觉。</p>
<p>一切都好像很平常。忽然感觉自己这段时间的心态不太好。脸色也不好。心情也没有那么好了。</p>
<p>什么理想抱负，什么狗屁金钱爱情。</p>
<p>现在我想认真看看书。最近发现很多好书。以前要是好好看看多好。</p>
<p>明天是否来临？我要早起去看初生的阳光。</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2010/10/13/303/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>QML Rectangle Element Reference(翻译)</title>
		<link>http://hacktao.com/2010/05/31/299</link>
		<comments>http://hacktao.com/2010/05/31/299#comments</comments>
		<pubDate>Mon, 31 May 2010 08:02:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开博导言]]></category>
		<category><![CDATA[Rectangle]]></category>

		<guid isPermaLink="false">http://hacktao.com/?p=299</guid>
		<description><![CDATA[QML Rectangle Element Reference  本文章原创于www.hacktao.com 转载请注明出处。 Rectangle项允许你加入一个场景。 属性 · border.color : color· border.width : int · color : color · gradient : Gradient· radius : real · smooth : bool   详细描述 Rectangle项有一个坚实的填充（彩色）和一个可选的边界。你可以用通过用半径（radius) 来创建圆角。  Rectangle {      width: 100      height: 100      color: &#8221;red&#8221;      border.color: &#8221;black&#8221;      border.width: 5      radius: 10   //半径  } 属性文档 border.width : int border.color : color Width和color用于绘制矩形的边界。 Width为1创建一个细线。对于没有线，使用0或透明色的宽度。 为了保持平稳(而不是模糊的边界),奇数宽度矩形导致被涂在半像素偏移; color : color   这个属性是用于填充rectangle  // green rectangle using hexidecimal notation  Rectangle { color: &#8221;#00FF00&#8243; }  // steelblue rectangle using SVG color name  Rectangle { color: &#8221;steelblue&#8221; } 默认是白色。. 如果同时梯度(gradient)和颜色指定，梯度将被使用。 gradient : Gradient Gradient用于填充Rectangle 此属性允许在简单的垂直梯度建设。其他梯度可借加入旋转的矩形组成。 rotation to the rectangle. &#8230;<p class="read-more"><a href="http://hacktao.com/2010/05/31/299">继续阅读 &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>QML Rectangle Element Reference</p>
<p> 本文章原创于<a href="http://www.hacktao.com">www.hacktao.com</a> 转载请注明出处。</p>
<p>Rectangle项允许你加入一个场景。</p>
<p>属性</p>
<table>
<tbody>
<tr>
<td width="219" valign="middle">· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#border.color-prop">border.color</a> : color· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#border.width-prop">border.width</a> : int</p>
<p>· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#color-prop">color</a> : color</td>
<td width="203" valign="middle">· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#gradient-prop">gradient</a> : Gradient· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#radius-prop">radius</a> : real</p>
<p>· <a href="http://hacktao.com/wp-admin/qml-rectangle.html#smooth-prop">smooth</a> : bool</td>
</tr>
</tbody>
</table>
<p> </p>
<p>详细描述</p>
<p>Rectangle项有一个坚实的填充（彩色）和一个可选的边界。你可以用通过用半径（radius)</p>
<p>来创建圆角。</p>
<p> Rectangle {</p>
<p>     width: 100</p>
<p>     height: 100</p>
<p>     color: &#8221;red&#8221;</p>
<p>     border.color: &#8221;black&#8221;</p>
<p>     border.width: 5</p>
<p>     radius: 10   //半径</p>
<p> }</p>
<p><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-0.png" alt="" width="123" height="122" /></p>
<p><!--EndFragment-->属性文档</p>
<table>
<tbody>
<tr>
<td width="157" valign="middle">border.width : <a href="http://hacktao.com/wp-admin/qml-int.html">int</a></td>
</tr>
<tr>
<td width="157" valign="middle">border.color : <a href="http://hacktao.com/wp-admin/qml-rectangle.html#color-prop">color</a></td>
</tr>
</tbody>
</table>
<p>Width和color用于绘制矩形的边界。<br />
Width为1创建一个细线。对于没有线，使用0或透明色的宽度。<br />
为了保持平稳(而不是模糊的边界),奇数宽度矩形导致被涂在半像素偏移;</p>
<table>
<tbody>
<tr>
<td width="98" valign="middle">color : <a href="http://hacktao.com/wp-admin/qml-rectangle.html#color-prop">color</a></td>
</tr>
</tbody>
</table>
<p> </p>
<p><span id="more-299"></span></p>
<p>这个属性是用于填充rectangle</p>
<p> // green rectangle using hexidecimal notation</p>
<p> Rectangle { color: &#8221;#00FF00&#8243; }</p>
<p> // steelblue rectangle using SVG color name</p>
<p> Rectangle { color: &#8221;steelblue&#8221; }</p>
<p>默认是白色。.</p>
<p>如果同时梯度(gradient)和颜色指定，梯度将被使用。</p>
<table>
<tbody>
<tr>
<td width="125" valign="middle">gradient : <a href="http://hacktao.com/wp-admin/qml-gradient.html">Gradient</a></td>
</tr>
</tbody>
</table>
<p>Gradient用于填充Rectangle</p>
<p>此属性允许在简单的垂直梯度建设。其他梯度可借加入旋转的矩形组成。</p>
<p>rotation to the rectangle.</p>
<table>
<tbody>
<tr>
<td width="264" valign="middle"> <img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-0.png" alt="" width="162" height="676" /></p>
<p><!--EndFragment--></td>
<td width="279" valign="middle">  Rectangle { y: 0; width: 80; height: 80; color: &#8221;lightsteelblue&#8221; }              </p>
<p> Rectangle { y: 100; width: 80; height: 80</p>
<p>   gradient: Gradient {</p>
<p>         GradientStop { position: 0.0; color: &#8221;lightsteelblue&#8221; }</p>
<p>         GradientStop { position: 1.0; color: &#8221;blue&#8221; }</p>
<p>     }</p>
<p> }</p>
<p> Rectangle { rotation: 90; y: 200; width: 80; height: 80</p>
<p>     gradient: Gradient {</p>
<p>         GradientStop { position: 0.0; color: &#8221;lightsteelblue&#8221; }</p>
<p>         GradientStop { position: 1.0; color: &#8221;blue&#8221; }</p>
<p>     }</p>
<p> }</td>
</tr>
</tbody>
</table>
<p>注意：如果属性gradient和color同时存在的话，属性gradient会被使用。</p>
<table>
<tbody>
<tr>
<td width="96" valign="middle">radius : <a href="http://hacktao.com/wp-admin/qml-real.html">real</a></td>
</tr>
</tbody>
</table>
<p>这个属性保存的角落半径用来绘制一个圆角矩形。<br />
如果半径不为零，将矩形（rectangle）画成圆角长方形，否则将被视为正常的矩形画。使用相同的半径是所有4个角落，目前还没有办法为不同的角指定不同的不同的半径。</p>
<p>其中real是浮点类型。</p>
<table>
<tbody>
<tr>
<td width="104" valign="middle">smooth : <a href="http://hacktao.com/wp-admin/qml-bool.html">bool</a></td>
</tr>
</tbody>
</table>
<p>如果你想的项目顺利缩放或改变，则设置这个属性。</p>
<p>滑滤波提供更好的视觉质量，但速度较慢。如果该项目在其自然大小显示，该属性没有视觉或性能的影响</p>
<p>效果：</p>
<p><img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-0.png" alt="" width="555" height="336" /></p>
<p><!--EndFragment-->在这幅图上，自上而下，smooth的值在减小</p>
]]></content:encoded>
			<wfw:commentRss>http://hacktao.com/2010/05/31/299/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

