﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-LIULIANG-随笔分类-c++</title><link>http://www.cppblog.com/LIULIANG/category/19015.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 19 Oct 2012 08:33:49 GMT</lastBuildDate><pubDate>Fri, 19 Oct 2012 08:33:49 GMT</pubDate><ttl>60</ttl><item><title>C++读二进制文件 及 C++设置double精度  </title><link>http://www.cppblog.com/LIULIANG/archive/2012/10/17/193436.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Wed, 17 Oct 2012 13:22:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/10/17/193436.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/193436.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/10/17/193436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/193436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/193436.html</trackback:ping><description><![CDATA[<h3 class="title pre fs1"><span class="tcnt"><font size="5" face="微软雅黑">C++读二进制文件 及 C++设置double精度</font></span>&nbsp;&nbsp;<span class="bgc0 fc07 fw0 fs0"></span></h3>
<p style="line-height: 20px" class="tdep clearfix nbw-act fc06"><span class="pleft"><span class="blogsep">2010-01-29 22:28:35</span><span class="blogsep">|&nbsp;&nbsp;分类：</span> <a class="fc03 m2a" title="C/C++" href="http://ffwmxr.blog.163.com/blog/#m=0&amp;t=1&amp;c=fks_087071082082089074085081094095082080082068086081084065">C/C++</a> <span id="$_blogTagTitle" class="blogsep phide">|&nbsp;&nbsp;标签：</span><span id="$_blogTagInfo" class="fc03 phide"></span> </span><span class="pright fc07 ztag"><span class="blogsep">|</span><span id="$_fontswitch" class="zihao fc03" __1350480039546__="ev_7995307323">字号<span id="$_fontsTypes" class="zihaoshow  phide"><span class="zihaoc bdc0"><span class="stag" __1350480039546__="ev_9993585492" __tabkey__="true" index="0"></span><span class="fc04 stag" __1350480039546__="ev_9919263018" __tabkey__="true" index="1">大</span><span class="fc04 stag selected js-fcurrent fc05" __1350480039546__="ev_6378856341" __tabkey__="true" index="2">中</span><span class="fc04 stag" __1350480039546__="ev_5318162410" __tabkey__="true" index="3">小</span></span></span></span></span><span id="$_blog_subscribe" class="pright pnt fc03" __1350480039546__="ev_2086320532"><span class="iblock icn0 icn0-919">&nbsp;</span><a class="m2a">订阅</a></span> </p>
<div></div>
<div class="nbw-blog-start"></div>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2" __1350480039546__="ev_3426428214">
<p align="center"><font size="3"><strong>C++设置double精度</strong></font></p>
<p>#include &lt;iomanip&gt;</p>
<p>cout<strong><font color="#ff00ff"> &lt;&lt;</font></strong> setiosflags<strong><font color="#ff00ff">(</font></strong>ios<strong><font color="#ff00ff">::</font></strong>fixed<strong><font color="#ff00ff">) &lt;&lt;</font></strong> setprecision<strong><font color="#ff00ff">(</font></strong><font color="#cc3300">2</font><strong><font color="#ff00ff">) &lt;&lt;</font></strong> m<strong><font color="#ff00ff"> &lt;&lt;</font></strong><font color="green"> "%"</font><strong><font color="#ff00ff"> &lt;&lt;</font></strong> endl<strong><font color="#ff00ff">;</font></strong></p>
<p><font color="#ff00ff"><font color="#000000">*********************************************************************************************************************************************</font></font></p>
<p align="center"><font color="#000000" size="3"><strong>C++读二进制文件例子</strong></font></p>
<p>首先：文件Binary.bin中按行存储的是结构体数据，为二进制格式数据；</p>
<p>其次：将Binary.bin中的数据读出并存入out.txt文件，非二进制格式数据。</p>
<p>#include &lt;fstream&gt;<br />#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />#include &lt;iomanip&gt;<br />using namespace std;</p>
<p><font color="#3366ff">typedef struct _FourNum<br />{<br />&nbsp;char&nbsp;&nbsp; First;<br />&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Second;<br />&nbsp;long&nbsp;&nbsp; Third;<br />&nbsp;double Fourth;<br />}FourNum;</font></p>
<p><font color="#ff0000"><strong>int&nbsp;main()<br /></strong></font>{<br />&nbsp;FourNum four;<br />&nbsp;int i = 0;<br />&nbsp;double scale = 1.0123;</p>
<p>&nbsp;<font color="#3366ff">ofstream out;<br /></font>&nbsp;<font color="#3366ff">out.open("D:\\Binary.bin", ios::out | ios::binary);</font></p>
<p>&nbsp;while(i&lt;1024)<br />&nbsp;{<br />&nbsp;&nbsp;four.First = (char)(i%256);<br />&nbsp;&nbsp;four.Second = i;<br />&nbsp;&nbsp;four.Third&nbsp; = i*i;<br />&nbsp;&nbsp;four.Fourth = i*scale*scale;<br />&nbsp; ++i；<br />&nbsp; <font color="#3366ff">out.write((char*)&amp;four,sizeof(FourNum));</font></p>
<p>&nbsp;}<br />&nbsp;<font color="#3366ff">out.close();</font></p>
<p>&nbsp;four.First = 0;<br />&nbsp;four.Second = 0;<br />&nbsp;four.Third&nbsp; = 0;<br />&nbsp;four.Fourth = 0;</p>
<p><font color="#3366ff">&nbsp;ifstream infile;<br />&nbsp;infile.open("D:\\Binary.bin", ios::binary);</font></p>
<p><font color="#3366ff">&nbsp;ofstream outfile;<br />&nbsp;outfile.open("D:\\out.txt", ios::out | ios::app);</font></p>
<p>&nbsp;while(<font color="#3366ff">!infile.eof()</font>)<br />&nbsp;{<br />&nbsp;&nbsp;<font color="#3366ff">infile.read((char*)&amp;four,sizeof(FourNum));</font></p>
<p>&nbsp;&nbsp;outfile&lt;&lt;four.First&lt;&lt;" ";<br />&nbsp;&nbsp;outfile&lt;&lt;four.Second&lt;&lt;" ";<br />&nbsp;&nbsp;outfile&lt;&lt;four.Third&lt;&lt;" ";<br />&nbsp;&nbsp;<font color="#3366ff">outfile&lt;&lt;setiosflags(ios::fixed) &lt;&lt; setprecision(7)&lt;&lt;four.Fourth&lt;&lt;endl;</font></p>
<p>&nbsp;}<br />&nbsp;infile.close();<br />&nbsp;outfile.close();</p>
<p>&nbsp;system("pause");<br />&nbsp;return 0;</p>
<p>}</p>
<p>***************************************************c++文件操作函数**********************************************************</p>
<p align="center"><font size="3"><strong>C/C++ 文件读写操作总结</strong></font></p>
<p><font color="#0000ff">转载自：</font><a href="http://www.diybl.com/course/3_program/c++/cppjs/200822/98428.html" rel="nofollow"><font color="#0000ff">http://www.diybl.com/course/3_program/c++/cppjs/200822/98428.html</font></a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在编程的过程中，文件的操作是一个经常用到的问题，在C++中，可以使用多种方法对文件操作，下面就按以下几个部分对此作详细介绍，就是： <br />&nbsp;</p>
<p>1、基于C的文件操作；</p>
<p>2、基于C++的文件操作；</p>
<p>3、基于WINAPI的文件操作；</p>
<p>4、基于BCB库的文件操作；</p>
<p>5、特殊文件的操作。</p>
<p>　</p>
<p><font color="#3366ff">基于C的文件操作</font> <br />　　<font color="#ff0000">在ANSI C中，对文件的操作分为两种方式，即<strong>流式文件操作</strong>和<strong>I/O文件操作</strong></font>。下面就分别介绍之。</p>
<p><font color="#ff0000">一、流式文件操作<br /></font>　　这种方式的文件操作有一个重要的结构FILE，FILE在stdio.h中定义如下：</p>
<p>typedef struct {<br />&nbsp; int level;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* fill/empty level of buffer */ <br />&nbsp; unsigned flags;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* File status flags */<br />&nbsp; char fd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* File descriptor */<br />&nbsp; unsigned char hold;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/* Ungetc char if no buffer */<br />&nbsp; int bsize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Buffer size */<br />&nbsp; unsigned char _FAR *buffer;&nbsp; /* Da<wbr>ta transfer buffer */<br />&nbsp; unsigned char _FAR *curp;&nbsp;&nbsp;&nbsp; /* Current active pointer */<br />&nbsp; unsigned istemp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/* Temporary file indicator */<br />&nbsp; short token;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/* Used for validity checking */<br />} FILE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;/* This is the FILE object */</p>
<p>　　FILE这个结构包含了文件操作的基本属性，对文件的操作都要通过这个结构的指针来进行，此种文件操作常用的函数见下表：</p>
<p>函数 功能 <br />fopen() 打开流 <br />fclose() 关闭流 <br />fputc() 写一个字符到流中 <br />fgetc() 从流中读一个字符 <br />fseek() 在流中定位到指定的字符 <br />fputs() 写字符串到流 <br />fgets() 从流中读一行或指定个字符 <br />fprintf() 按格式输出到流 <br />fscanf() 从流中按格式读取 <br />feof() 到达文件尾时返回真值 <br />ferror() 发生错误时返回其值 <br />rewind() 复位文件定位器到文件开始处 <br />remove() 删除文件 <br />fread() 从流中读指定个数的字符 <br />fwrite() 向流中写指定个数的字符 <br />tmpfile() 生成一个临时文件流 <br />tmpnam() 生成一个唯一的文件名&nbsp;</p>
<p><strong><font color="#0000ff">下面就介绍一下这些函数</font></strong></p>
<p><font color="#3366ff">1.fopen()<br /></font>　　fopen的原型是：FILE *fopen(const char *filename,const char *mode)，fopen 实现三个功能</p>
<p>为使用而打开一个流 <br />把一个文件和此流相连接 <br />给此流返回一个FILE指针<br />参数filename指向要打开的文件名，mode表示打开状态的字符串，其取值如下表</p>
<p>字符串 含义 <br />"r" 以只读方式打开文件 <br />"w" 以只写方式打开文件 <br />"a" 以追加方式打开文件 <br />"r+" 以读/写方式打开文件，如无文件出错 <br />"w+" 以读/写方式打开文件，如无文件生成新文件 </p>
<p>　　<font color="#3366ff">一个文件可以以文本模式或二进制模式打开，这两种的区别是：在文本模式中回车被当成一个字符''\n''，而二进制模式认为它是两个字符0x0D,0x0A</font>；如果在文件中读到0x1B，文本模式会认为这是文件结束符，也就是二进制模型不会对文件进行处理，而文本方式会按一定的方式对数据作相应的转换。</p>
<p>　　<font color="#ff0000"><strong>系统默认的是以文本模式打开，可以修改全部变量_fmode的值来修改这个设置</strong></font>。</p>
<p>　　<font color="#3366ff">我们也可以在模式字符串中指定打开的模式，如"rb"表示以二进制模式打开只读文件，"w+t"或"wt+"表示以文本模式打开读/写文件。</font></p>
<p>　　此函数返回一个FILE指针，所以申明一个FILE指针后不用初始化，而是用fopen()来返回一个指针并与一个特定的文件相连，如果失败，返回NULL。</p>
<p>例:</p>
<p>　　FILE *fp; <br />　　if(fp=fopen("123.456","wb"))<br />　　　　puts("打开文件成功");<br />　　else <br />　　　　puts("打开文件成败"); </p>
<p><font color="#3366ff">2.fclose()</font> <br />　　fclose()的功能就是关闭用fopen()打开的文件，其原型是：int fclose(FILE *fp); 如果成功，返回0；失败返回EOF。</p>
<p>　　在程序结束时一定要记得关闭打开的文件，不然可能会造成数据丢失的情况，我以前就经常犯这样的毛病。</p>
<p>例：fclose(fp);</p>
<p><font color="#3366ff">3.fputc()</font><br />　　向流写一个字符，原型是int fputc(int c, FILE *stream); 成功返回这个字符，失败返回EOF。</p>
<p>例：fputc(''X'',fp);</p>
<p><font color="#3366ff">4.fgetc()<br /></font>　　从流中读一个字符，原型是int fputc(FILE *stream); 成功返回这个字符，失败返回EOF。</p>
<p>例：char ch1=fgetc(fp);</p>
<p><font color="#3366ff">5. fseek()<br /></font>　　<font color="#3366ff">此函数一般用于二进制模式打开的文件中，功能是定位到流中指定的位置</font>，原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0，参数offset是移动的字符数，whence是移动的基准，取值是</p>
<p>符号常量 值 基准位置 <br />SEEK_SET 0 文件开头 <br />SEEK_CUR 1 当前读写的位置 <br />SEEK_END 2 文件尾部 </p>
<p>例：fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)</p>
<p>　　fseek(fp,0L,2);//把读写位置移动到文件尾</p>
<p><font color="#3366ff">6.fputs()<br /></font>　　写一个字符串到流中，原型int fputs(const char *s, FILE *stream); </p>
<p>例：fputs("I Love You",fp);</p>
<p><font color="#3366ff">7.fgets()</font><br />　　从流中读一行或指定个字符，原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符，除非读完一行，参数s是来接收字符串，如果成功则返回s的指针，否则返回NULL。</p>
<p>例：如果一个文件的当前位置的文本如下</p>
<p>Love ,I Have</p>
<p>But &#8230;&#8230;..</p>
<p>如果用</p>
<p>　　fgets(str1,4,file1);</p>
<p>则执行后str1="Lov"，读取了4-1=3个字符，而如果用</p>
<p>　　fgets(str1,23,file1);</p>
<p>则执行str="Love ,I Have"，<font color="#3366ff">读取了一行(不包括行尾的''\n'')。</font></p>
<p><font color="#3366ff">8.fprintf()<br /></font>　　按格式输入到流，其原型是int fprintf(FILE *stream, const char *format[, argument, &#8230;]);其用法和printf()相同，不过不是写到控制台，而是写到流罢了</p>
<p>例：fprintf(fp,"%2d%s",4,"Hahaha");</p>
<p><font color="#3366ff">9.fscanf()<br /></font>　　从流中按格式读取，其原型是int fscanf(FILE *stream, const char *format[, address, &#8230;]);其用法和scanf()相同，不过不是从控制台读取，而是从流读取罢了。</p>
<p>例：fscanf(fp,"%d%d" ,&amp;x,&amp;y);</p>
<p><font color="#3366ff">10.feof()<br /></font>　　检测是否已到文件尾，是返回真，否则返回0，其原型是int feof(FILE *stream);</p>
<p>例：if(feof(fp))printf("已到文件尾");</p>
<p><font color="#3366ff">11.ferror()</font><br />　　原型是int ferror(FILE *stream);返回流最近的错误代码，可用clearerr()来清除它，clearerr()的原型是void clearerr(FILE *stream);</p>
<p>例：printf("%d",ferror(fp));</p>
<p><font color="#3366ff">12.rewind()</font><br />　　把当前的读写位置回到文件开始，原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);</p>
<p>例：rewind(fp);</p>
<p><font color="#3366ff">12.remove()<br /></font>　　删除文件，原型是int remove(const char *filename); 参数就是要删除的文件名，成功返回0。</p>
<p>例：remove("c:\\io.sys");</p>
<p><font color="#3366ff">13.fread()</font><br />　　从流中读指定个数的字符，原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据，void*的指针可用任何类型的指针来替换，如char*、int *等等来替换；size是每块的字节数；n是读取的块数，如果成功，返回实际读取的块数(不是字节数)，<font color="#3366ff">本函数一般用于二进制模式打开的文件中</font>。</p>
<p>例：</p>
<p>　　char x[4230];<br />　　FILE *file1=fopen("c:\\msdos.sys","r");<br />　　fread(x,200,12 ,file1);//共读取200*12=2400个字节</p>
<p><font color="#3366ff">14.fwrite()<br /></font>　　与fread对应，向流中写指定的数据，原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针，void*的指针可用任何类型的指针来替换，如char*、int *等等来替换；size是每块的字节数；n是要写的块数，如果成功，返回实际写入的块数(不是字节数)，<font color="#3366ff">本函数一般用于二进制模式打开的文件中</font>。</p>
<p>例：</p>
<p>　　char x[]="I Love You";<br />　　fwire(x, 6,12,fp);//写入6*12=72字节</p>
<p>　　将把"I Love"写到流fp中12次，共72字节</p>
<p><font color="#3366ff">15.tmpfile()</font><br />　　其原型是FILE *tmpfile(void); 生成一个临时文件，以"w+b"的模式打开，并返回这个临时流的指针，如果失败返回NULL。在程序结束时，这个文件会被自动删除。</p>
<p>例：FILE *fp=tmpfile();</p>
<p>16.tmpnam();<br />　　其原型为char *tmpnam(char *s); 生成一个唯一的文件名，其实tmpfile()就调用了此函数，参数s用来保存得到的文件名，并返回这个指针，如果失败，返回NULL。</p>
<p>例：tmpnam(str1);</p>
<p><br /><font color="#ff0000">二、直接I/O文件操作</font><br />　　这是C提供的另一种文件操作，它是通过直接存/取文件来完成对文件的处理，而上篇所说流式文件操作是通过缓冲区来进行；流式文件操作是围绕一个FILE指针来进行，而此类文件操作是围绕一个文件的&#8220;句柄&#8221;来进行，什么是句柄呢？它是一个整数，是系统用来标识一个文件(在WINDOWS中，句柄的概念扩展到所有设备资源的标识)的唯一的记号。此类文件操作常用的函数如下表，这些函数及其所用的一些符号在io.h和fcntl.h中定义，在使用时要加入相应的头文件。</p>
<p>函数 说明 <br />open() 打开一个文件并返回它的句柄 <br />close() 关闭一个句柄 <br />lseek() 定位到文件的指定位置 <br />read() 块读文件 <br />write() 块写文件 <br />eof() 测试文件是否结束 <br />filelength() 取得文件长度 <br />rename() 重命名文件 <br />chsize() 改变文件长度 </p>
<p>　　下面就对这些函数一一说明：</p>
<p><font color="#3366ff">1.open()<br /></font>　　打开一个文件并返回它的句柄，如果失败，将返回一个小于0的值，原型是int open(const char *path, int access [, unsigned mode]); 参数path是要打开的文件名，access是打开的模式。mode是可选项，表示文件的属性，主要用于UNIX系统中，在DOS/WINDOWS这个参数没有意义。其中文件的打开模式如下表。</p>
<p>符号 含义 符号 含义 符号 含义 <br />O_RDONLY 只读方式 O_WRONLY 只写方式 O_RDWR 读/写方式 <br />O_NDELAY 用于UNIX系统 O_APPEND 追加方式 O_CREAT 如果文件不存在就创建 <br />O_TRUNC 把文件长度截为0 O_EXCL 和O_CREAT连用，如果文件存在返回错误 O_BINARY 二进制方式 <br />O_TEXT 文本方式 </p>
<p>　　<font color="#3366ff">对于多个要求，可以用"|"运算符来连接</font>，如O_APPEND|O_TEXT表示以文本模式和追加方式打开文件。</p>
<p>例：int handle=open("c:\\msdos.sys",O_BINARY|O_CREAT|O_WRITE)</p>
<p><font color="#3366ff">2.close()</font><br />　　关闭一个句柄，原型是int close(int handle);如果成功返回0</p>
<p>例：close(handle)</p>
<p><font color="#3366ff">3.lseek()</font><br />　　定位到指定的位置，原型是：long lseek(int handle, long offset, int fromwhere);参数offset是移动的量，fromwhere是移动的基准位置，取值和前面讲的fseek()一样，SEEK_SET：文件首部；SEEK_CUR：文件当前位置；SEEK_END：文件尾。此函数返回执行后文件新的存取位置。</p>
<p>例：</p>
<p>　　lseek(handle,-1234L,SEEK_CUR);//把存取位置从当前位置向前移动1234个字节。<br />　　x=lseek(hnd1,0L,SEEK_END);//把存取位置移动到文件尾，x=文件尾的位置即文件长度</p>
<p><font color="#3366ff">4.read()</font><br />　　从文件读取一块，原型是int read(int handle, void *buf, unsigned len);参数buf保存读出的数据，len是读取的字节。函数返回实际读出的字节。</p>
<p>例：char x[200];read(hnd1,x,200);</p>
<p><font color="#3366ff">5.write()<br /></font>　　写一块数据到文件中，原型是int write(int handle, void *buf, unsigned len);参数的含义同read()，返回实际写入的字节。</p>
<p>例：char x[]="I Love You";write(handle,x,strlen(x));</p>
<p><font color="#3366ff">7.eof()<br /></font>　　类似feof()，测试文件是否结束，是返回1，否则返回0;原型是：int eof(int handle);</p>
<p>例：while(!eof(handle1)){&#8230;&#8230;};</p>
<p><font color="#3366ff">8.filelength()</font><br />　　返回文件长度，原型是long filelength(int handle);相当于lseek(handle,0L,SEEK_END)</p>
<p>例：long x=filelength(handle);</p>
<p><font color="#3366ff">9.rename()</font><br />　　重命名文件，原型是int rename(const char *oldname, const char *newname); 参数oldname是旧文件名，newname是新文件名。成功返回0</p>
<p>例：rename("c:\\config.sys","c:\\config.w40");</p>
<p><font color="#3366ff">10.chsize();</font><br />　　改变文件长度，原型是int chsize(int handle, long size);参数size表示文件新的长度，成功返回0，否则返回-1，如果指定的长度小于文件长度，则文件被截短；如果指定的长度大于文件长度，则在文件后面补''\0''。</p>
<p>例：chsize(handle,0x12345);</p>
<p><br />-------------------------------------------------------------------------------------------------------------------------------------------</p>
<p>　　如果熟悉汇编可能会发现这种方式和汇编语言的DOS功能调用句柄式文件操作很像，比如open()就像DOS服务的3CH号功能调用，其实这种操作还有两种类型的函数就是直接用DOS功能来完成的，如_open()，_dos_open()等等。有兴趣可自已查询BCB的帮助。</p>
<p>　　同流式文件操作相同，这种也提供了Unicode字符操作的函数，如_wopen()等等，用于9X/NT下的宽字符编程，有兴趣可自已查询BCB的帮助。</p>
<p>　　另外，此种操作还有lock(),unlock(),locking()等用于多用户操作的函数，但在BCB中用得并不多，我就不介绍了，但如果要用C来写CGI，这些就必要的常识了，如果你有这方面的要求，那就得自已好好看帮助了。 </p>
<p>　 </p>
<p>　　<font color="#3366ff">在C++中，有一个stream这个类，所有的I/O都以这个&#8220;流&#8221;类为基础的，包括我们要认识的文件I/O</font>，stream这个类有两个重要的运算符：</p>
<p><font color="#3366ff">1、插入器(&lt;&lt;)</font><br />　　向流输出数据。比如说系统有一个默认的标准输出流(cout)，一般情况下就是指的显示器，所以，cout&lt;&lt;"Write Stdout"&lt;&lt;''\n'';就表示把字符串"Write Stdout"和换行字符(''\n'')输出到标准输出流。</p>
<p><font color="#3366ff">2、析取器(&gt;&gt;)<br /></font>　　从流中输入数据。比如说系统有一个默认的标准输入流(cin)，一般情况下就是指的键盘，所以，cin&gt;&gt;x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。</p>
<p>　　<font color="#ff0000"><strong>在C++中，对文件的操作是通过stream的子类fstream(file stream)来实现的</strong></font>，所以，要用这种方式操作文件，就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。</p>
<p><font color="#3366ff">一、打开文件<br /></font>　　在fstream类中，有一个成员函数open()，就是用来打开文件的，其原型是：</p>
<p>void open(const char* filename,int mode,int access);</p>
<p>参数：</p>
<p>filename：　　要打开的文件名 <br />mode：　　　　要打开文件的方式 <br />access：　　　打开文件的属性<br />打开文件的方式在类ios(是所有流式I/O类的基类)中定义，常用的值如下： </p>
<p>ios::app：　　　以追加的方式打开文件 <br />ios::ate：　　　文件打开后定位到文件尾，ios:app就包含有此属性 <br />ios::binary： 　以二进制方式打开文件，缺省的方式是文本方式。两种方式的区别见前文 <br />ios::in：　　　 文件以输入方式打开 <br />ios::out：　　　文件以输出方式打开 <br />ios::nocreate： 不建立文件，所以文件不存在时打开失败　 <br />ios::noreplace：不覆盖文件，所以打开文件时如果文件存在失败 <br />ios::trunc：　　如果文件存在，把文件长度设为0 <br /><font color="#0000ff">可以用&#8220;或&#8221;把以上属性连接起来，如ios::out|ios::binary</font></p>
<p>打开文件的属性取值是：</p>
<p>0：普通文件，打开访问 <br />1：只读文件 <br />2：隐含文件 <br />4：系统文件 <br /><font color="#0000ff">可以用&#8220;或&#8221;或者&#8220;+&#8221;把以上属性连接起来 ，如3或1|2就是以只读和隐含属性打开文件</font>。</p>
<p>　　<font color="#008000">例如：以二进制输入方式打开文件c:\config.sys</font> </p>
<p>　　fstream file1;<br />　　file1.open("c:\\config.sys",ios::binary|ios::in,0);</p>
<p>　　如果open函数只有文件名一个参数，则是以读/写普通文件打开，即：</p>
<p>　　file1.open("c:\\config.sys");&lt;=&gt;file1.open("c:\\config.sys",ios::in|ios::out,0);</p>
<p>　　另外，fstream还有和open()一样的构造函数，对于上例，在定义的时侯就可以打开文件了：</p>
<p>　　fstream file1("c:\\config.sys");</p>
<p>　　特别提出的是，<font color="#3366ff">fstream有两个子类：ifstream(input file stream)和ofstream(outpu file stream)，ifstream默认以输入方式打开文件，而ofstream默认以输出方式打开文件</font>。</p>
<p>　　ifstream file2("c:\\pdos.def");//以输入方式打开文件<br />　　ofstream file3("c:\\x.123");//以输出方式打开文件</p>
<p>　　所以，在实际应用中，根据需要的不同，选择不同的类来定义：如果想以输入方式打开，就用ifstream来定义；如果想以输出方式打开，就用ofstream来定义；如果想以输入/输出方式来打开，就用fstream来定义。</p>
<p><font color="#3366ff">二、关闭文件<br /></font>　　打开的文件使用完成后一定要关闭，fstream提供了成员函数close()来完成此操作，如：file1.close();就把file1相连的文件关闭。</p>
<p><font color="#3366ff">三、读写文件<br /></font>　　读写文件分为文本文件和二进制文件的读取，对于文本文件的读取比较简单，用插入器和析取器就可以了；而对于二进制的读取就要复杂些，下要就详细的介绍这两种方式</p>
<p>　<font color="#3366ff">　1、文本文件的读写</font><br />　　文本文件的读写很简单：用插入器(&lt;&lt;)向文件输出；用析取器(&gt;&gt;)从文件输入。假设file1是以输入方式打开，file2以输出打开。示例如下：</p>
<p>　　file2&lt;&lt;"I Love You";//向文件写入字符串"I Love You"<br />　　int I;<br />　　file1&gt;&gt;I;//从文件输入一个整数值。 </p>
<p>这种方式还有一种简单的格式化能力，比如可以指定输出为16进制等等，具体的格式有以下一些</p>
<p><font color="#339966">操纵符 功能 输入/输出 <br />dec 格式化为十进制数值数据 输入和输出 <br />endl 输出一个换行符并刷新此流 输出 <br />ends 输出一个空字符 输出 <br />hex 格式化为十六进制数值数据 输入和输出 <br />oct 格式化为八进制数值数据 输入和输出 <br />setpxecision(int p) 设置浮点数的精度位数 输出</font> </p>
<p>　　比如要把123当作十六进制输出：file1&lt;&lt;hex&lt;&lt;123;要把3.1415926以5位精度输出：file1&lt;&lt;setpxecision(5)&lt;&lt;3.1415926。</p>
<p>　　<font color="#3366ff">2、二进制文件的读写<br /></font><font color="#3366ff">&#9312;put()</font><br />　　put()函数向流写入一个字符，其原型是ofstream &amp;put(char ch)，使用也比较简单，如file1.put(''c'');就是向流写一个字符''c''。 </p>
<p><font color="#3366ff">&#9313;get()</font><br />　　get()函数比较灵活，有3种常用的重载形式：</p>
<p>　　一种就是和put()对应的形式：ifstream &amp;get(char &amp;ch);功能是从流中读取一个字符，结果保存在引用ch中，如果到文件尾，返回空字符。如file2.get(x);表示从文件中读取一个字符，并把读取的字符保存在x中。</p>
<p>　　另一种重载形式的原型是： int get();这种形式是从流中返回一个字符，如果到达文件尾，返回EOF，如x=file2.get();和上例功能是一样的。</p>
<p>　　还有一种形式的原型是：ifstream &amp;get(char *buf,int num,char delim=''\n'')；这种形式把字符读入由 buf 指向的数组，直到读入了 num 个字符或遇到了由 delim 指定的字符，如果没使用 delim 这个参数，将使用缺省值换行符''\n''。例如：</p>
<p>　　file2.get(str1,127,''A'');//从文件中读取字符到字符串str1，当遇到字符''A''或读取了127个字符时终止。</p>
<p><font color="#3366ff">&#9314;读写数据块<br /></font>　　<font color="#ff0000"><strong>要读写二进制数据块，请使用成员函数read()和write()成员函数</strong></font>，它们原型如下：</p>
<p>　　　　read(unsigned char *buf,int num);<br />　　　　write(const unsigned char *buf,int num);</p>
<p>　　read()从文件中读取 num 个字符到 buf 指向的缓存中，<font color="#3366ff">如果在还未读入 num 个字符时就到了文件尾，可以用成员函数 int gcount();来取得实际读取的字符数</font>；而 write() 从buf 指向的缓存写 num 个字符到文件中，值得注意的是缓存的类型是 unsigned char *，有时可能需要类型转换。</p>
<p>例：　　unsigned char str1[]="I Love You";<br />　　　　int n[5];<br />　　　　ifstream in("xxx.xxx");<br />　　　　ofstream out("yyy.yyy");<br />　　　　out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中<br />　　　　in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数，注意类型转换<br />　　　　in.close();out.close(); </p>
<p><font color="#3366ff">四、检测EOF<br /></font>　　成员函数eof()用来检测是否到达文件尾，如果到达文件尾返回非0值，否则返回0。原型是int eof();</p>
<p>例：　　if(in.eof())ShowMessage("已经到达文件尾！");</p></div><br /><br />转自：<a href="http://ffwmxr.blog.163.com/blog/static/663727222010029102835346/">http://ffwmxr.blog.163.com/blog/static/663727222010029102835346/</a><img src ="http://www.cppblog.com/LIULIANG/aggbug/193436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-10-17 21:22 <a href="http://www.cppblog.com/LIULIANG/archive/2012/10/17/193436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 基于Tight VNC的远程协助功能的实现 </title><link>http://www.cppblog.com/LIULIANG/archive/2012/08/24/188195.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Fri, 24 Aug 2012 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/08/24/188195.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/188195.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/08/24/188195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/188195.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/188195.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body">
<h2>整体布局</h2>
<p>　　在远程协助中，请求协助的一方称为被协助方，或者（远程协助）服务端；响应的一方称为协助方，或者（远程协助）客户端；这里命名被协助方为Cv,而协助方命名为Cs，中转服务器为Sr。</p>
<p>　　TightVNC是免费为个人和商业用途，提供有用的，完整的源代码，&nbsp;在管理，技术支持，教育和许多其他用途，&nbsp;跨平台，可用于Windows和Unix，Java客户端，包括&nbsp;与标准的VNC软件兼容，符合RFB协议规范。</p>
<p>TightVNC 分为Server和 Viewer两部分，Server作为请求协助端，Viewer协助端亦即是Cs和Cv 。</p>
<p><a href="http://vncrepeater.googlecode.com/svn/trunk/">　　Repeater</a>为中转服务器Sr，当Server连接Viewer是，通过Sr相互转发数据。对Cs的监控端口为5500，Cv的监控端口为5900，当然5500、5900都是vnc的默认端口，这样会引起其他一些VNC软件的冲突，所以Cs和Cv监控端口都需要修改。</p>
<p>整个设备架设可简化为如图1所示，分为情况</p>
<p>1)&nbsp;&nbsp;&nbsp;&nbsp; 协助用户Cv和请求协助用户Cs1在同一局域网内，这时Cv与Cs1可以直接进行TCP通信；</p>
<p>2)&nbsp;&nbsp;&nbsp;&nbsp; 协助用户Cv和请求协助用户Cs2不在同一局域网内，这时Cv与Cs2只能通过中转服务器相互转发数据进行通信。</p>
<p>&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919142668.png" /></p>
<p>&nbsp;</p>
<p align="center">&nbsp;整体布局</p>
<p>&nbsp;</p>
<h2>流程图</h2>
<p>一、被协助用户Cs请求协助用户Cv的协助过程流程图如图2所示；</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919154476.png" /></p>
<p align="center">&nbsp;Cs请求Cv协助过程流程图</p>
<p>1)&nbsp;&nbsp;&nbsp;&nbsp; 被协助者</p>
<ol><li>用户界面操作响应,向在线用户发送1301请求（远程协助请求）。</li><li>1301-Confirmation消息处理： </li></ol>
<p>如果对方拒绝接受请求，显示信息窗口，提示&#8220;远程请求被对方拒绝&#8221;。</p>
<p>如果对方接受请求，则创建远程协助对象；是否允许对方查看，调用远程协助对象的StartServer，参数为对方用户ID。</p>
<p><span style="text-align: center">申请受控请求</span></p>
<p>2)&nbsp;&nbsp;&nbsp;&nbsp; 协助者</p>
<ol><li>处理1301-Request消息。 </li></ol>
<p>窗口提示用户&#8220;xxxx发出远程协助邀请，您是否同意？&#8221;；如果&#8220;同意&#8221;则创建远程协助对象，调用远程协助对象Connect方法，连接对方的IP以及Port,建立TCP连接。调用用远程协助对象的SetHost（），参数为用户自己ID。</p>
<ol><li>处理申请受控消息。 </li></ol>
<p>调用用远程协助对象的SetViewOnly（），参数为false；远程协助建立成功。</p>
<p>双方通过中转服务器或者直接建立TCP连接，完成远程协助以及数据交互。</p>
<p>二、Server两种请求协助方式Connect和Listen</p>
<p>1)&nbsp;&nbsp;&nbsp;&nbsp; 在局域网中Server端和 Viewer端如果能够直接进行TCP通信的时，这时就不需要通过中转服务器，Viewer直接连接Server。流程图如图3所示</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919162314.png" />&nbsp;</p>
<p align="center">Cv与Cs直接进行TCP通信流程图</p>
<p>2)&nbsp;&nbsp;&nbsp;&nbsp; 当Server端和 Viewer端不能直接的TCP通信时，亦就可能是在两个不同的局域网中，这时就需要通过中转服务器Repeater进行Server端和 Viewer端的消息转发。流程图如图4所示</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919164443.png" /></p>
<p align="center">&nbsp;</p>
<p align="center">Cv与Cs通过Repeater通信流程图</p>
<h3>远程协助插件设计方案</h3>
<p>将Server和 Viewer封装在两个动态库中，分别为RemoteHelpServer和RemoteHelpViewer，外部调用RemoteHelpServer和RemoteHelpViewer时，应为单实例调用，即是已经作为一个客户端或者是服务器端时，不能再与其他人进行远程协助。</p>
<p>外部接口包括:连接方式、调节画面质量、画面模式和协助方式等</p>
<ol><li>连接方式：Viewer直连Server和通过Repeater与Server通信；</li><li>调节画面质量：1-9级别的lpeg图像压缩；</li><li>画面模式：8位和24位画面质量；</li><li>协助方式：仅屏幕查看和邀请方请求受控；</li><li>远程协助窗体模式：最大化，还原和最小化；</li><li>快捷键：Shift+Ctrl+Alt+F 全屏、ESC退出全屏。 </li></ol>
<h3>RemoteHelpServer和RemoteHelpViewer动态库接口函数说明</h3>
<h4>Server端接口函数：</h4>
<p align="left">//参数：无</p>
<p align="left">//返回值：Server端实例指针</p>
<p align="left">//作用：创建远程协助Server端实例</p>
<p align="left">RemoteHelpHandle *CreateRemoteHelpServer();</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：销毁远程协助Server端实例</p>
<p align="left">void DestoryRemoteHelpServer(RemoteHelpHandle *handle);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针，中转服务器IP及端口号</p>
<p align="left">//返回值：成功时返回Socket指针</p>
<p align="left">//作用：Server连接中转服务器</p>
<p align="left">SocketIPv4 *ServerConnect(RemoteHelpHandle *handle,TCHAR *host,unsigned short port);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针，监听端口号</p>
<p align="left">//返回值：成功时返回Socket指针</p>
<p align="left">//作用：Server监听</p>
<p align="left">SocketIPv4 *ServerListen(RemoteHelpHandle *handle,unsigned short port);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针，Socket指针,是否作为服务监听状态</p>
<p align="left">//返回值：0，1</p>
<p align="left">//作用：Server确认Viewer可以查看</p>
<p align="left">int AddNewConnection(RemoteHelpHandle *handle,SocketIPv4 *socket,bool bIsListenMode);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针，连接凭证</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：Server连接凭证</p>
<p align="left">void SetServerConnectionTag(RemoteHelpHandle *handle,char *pszConnectionTag);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Server端实例指针</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：Server端断开连接</p>
<p align="left">void ServerDisconnect(RemoteHelpHandle *handle);</p>
<h4>Viewer端接口函数：</h4>
<p align="left">//参数：无</p>
<p align="left">//返回值：Viewer端实例指针</p>
<p align="left">//作用：创建远程协助Viewer端实例</p>
<p align="left">RemoteHelpHandle *CreateRemoteHelpViewer();</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：销毁远程协助Viewer端实例</p>
<p align="left">void&nbsp; DestoryRemoteHelpViewer(RemoteHelpHandle *handle);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针，中转服务器IP及端口号</p>
<p align="left">//返回值：关闭窗体时返回true，其它为false</p>
<p align="left">//作用：Viewer连接中转服务器</p>
<p align="left">bool&nbsp; ViewerConnect(RemoteHelpHandle *handle,char *host,int port);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针，中转服务器IP及端口号</p>
<p align="left">//返回值：关闭窗体时返回true，其它为false</p>
<p align="left">//作用：Viewer连接中转服务器</p>
<p align="left">void&nbsp; SetViewerConnectionTag(RemoteHelpHandle *handle,char *pszConnectionTag);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针，是否使用8Bit</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：远程协助图像质量，两种情况8Bit,24Bit</p>
<p align="left">void&nbsp; Set8BitColor(RemoteHelpHandle *handle,bool use8Bit);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针，压缩率级数</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：远程协助图像压缩率</p>
<p align="left">void setJpegCompressionLevel(RemoteHelpHandle *handle,int level);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针， 是否为只查看</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：设置远程协助只查看或可控</p>
<p align="left">void setViewOnly(RemoteHelpHandle *handle,bool viewOnly);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针， 是否为全屏</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：设置远程协助窗体为全屏或退出全屏</p>
<p align="left">void setFullScreenMode(RemoteHelpHandle *handle,bool fullScreenMode);</p>
<p align="left">&nbsp;</p>
<p align="left">//参数：Viewer端实例指针</p>
<p align="left">//返回值：无</p>
<p align="left">//作用：Viewer端断开连接</p>
<p align="left">void ViewerDisconnect(RemoteHelpHandle *handle);</p>
<h2>程序界面</h2>
<p align="left">一、远程协助握手过程窗体界面显示：</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919215211.png" /></p>
<p align="center">&nbsp;&nbsp;请求远程协助&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919221196.png" /></p>
<p align="center">Viewer接受远程协助，等待确认Server确认查看</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919222714.png" /></p>
<p align="center">Server确认查看</p>
<p align="center"><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919224572.png" /></p>
<p align="center">&nbsp;Server已申请受控&nbsp;</p>
<p align="left">二、客户端Cv：如图5所示，连接成功后分别有属性设置、最大化、断开等按钮；左下方为显示图像面板。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919230165.jpg" /></p>
<p align="center">客户端Cv</p>
<p>三、属性设置：如图6所示，调节画面质量：1-9级别的lpeg图像压缩；画面模式：8位和24位画面质量</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919232945.png" /></p>
<p align="center">属性设置</p>
<p>四、客户端Cs：如图7所示，连接成功后，可以断开远程控制或者停止受控等操作。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919255312.jpg" /></p>
<p align="center">客户端Cs</p>
<p align="left">五、远程协助窗体：窗体模式分别有最大化，还原和最小化；快捷键分别有Shift+Ctrl+Alt+F 全屏、ESC退出全屏。当窗体最大化即全屏时，顶部出现工具条，可以控制窗体最大化，还原和最小化等操作，如图8所示，</p>
<p><img style="display: block; margin-left: auto; margin-right: auto" alt="" src="http://pic002.cnblogs.com/images/2012/107146/2012032919260933.jpg" /></p>
<p align="center">&nbsp;远程协助全屏模式</p>
<p style="text-align: left" align="center"><strong>　注：　</strong></p>
<p style="text-align: left" align="center">　　在这个功能刚开始做的时候，google 、百度了很多这方面的资料，无奈资料还是比较少的。其中有一篇论文《基于P2P的远程协助系统》，写得比较详细的方案，但最终没有实现P2P的方法，可能是一开始就走了弯路和现成的系统限制了，时间方面不允许和稳定性。</p>
<p style="text-align: left" align="center">　　<span>《基于P2P的远程协助系统》里面写是通过本地代理，中转服务器建立桥梁实现远程协助通信。其中<span>本地代理可以不管VNC里面代码的</span></span>逻辑具体实现，只是负责通信，对远程协助与VNC版本轻松解耦，没有依赖<span>VNC版本，可以不断地使VNC更新换代有重要意义。还有一个作用是可以TCP打洞实现P2P《<a class="postTitle2" id="homepage1_HomePageDays_DaysList_DayItem_1_DayList_1_TitleUrl_0" href="http://www.cnblogs.com/tony-law/articles/2323419.html">TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞</a>》，不依赖VNC内部发送规则。</span></p>
<p>　　《TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞》一文中这位前辈写TCP实现P2P的方法，我想这对一些刚开始做TCP实现P2P通信有很大的帮助，感谢他的分享的精神，至少我对TCP实现P2P通信有所了解了。他所说的实现过程如下</p>
<p>　　1、 S启动两个网络侦听，一个叫【主连接】侦听，一个叫【协助打洞】的侦听。<br />　　2、 A和B分别与S的【主连接】保持联系。<br />　　3、 当A需要和B建立直接的TCP连接时，首先连接S的【协助打洞】端口，并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上，所以必须为这些套接字设置 SO_REUSEADDR 属性（即允许重用），否则侦听会失败。<br />　　4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B，并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。<br />　　5、 B收到S的连接通知后首先与S的【协助打洞】端口连接，随便发送一些数据后立即断开，这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。<br />　　6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect，根据不同的路由器会有不同的结果，有些路由器在这个操作就能建立连接（例如我用的TPLink R402），大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败，但NAT-A会纪录此次连接的源地址和端口号，为接下来真正的连接做好了准备，这就是所谓的打洞，即B向A打了一个洞，下次A就能直接连接到B刚才使用的端口号了。<br />　　7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息&#8220;我已经准备好&#8221;，S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。<br />　　8、 A收到S回复的B的公网IP和端口号等信息以后，开始连接到B公网IP和端口号，由于在步骤6中B曾经尝试连接过A的公网IP地址和端口，NAT-A纪录了此次连接的信息，所以当A主动连接B时，NAT-B会认为是合法的SYN数据，并允许通过，从而直接的TCP连接建立起来了。</p>
<p>　　整个过程跟UDP打洞很类似，我认为他文中写可能是没有注重的写出一个重点，就是&#8220;Sock.SetSockOpt ( SO_REUSEADDR, &amp;nOptValue , sizeof(UINT) )&#8221;其中的SO_REUSEADDR，因为这样以上的过程才能够实现。</p>
<p>　　还有在OSChina里的一个讨论贴&#8220;C++实现TCP打洞的思想&#8221;，有些人说的tcp打洞无法实现，那些人我认为是根本没有去了解过吧，而且QQ的远程协助是TCP连接的，难道QQ的远程协助都是经服务器转发的？</p>
<p>　　知识有限，基本上想说的都说了！</p>
<p style="text-align: left" align="center"><span><br /></span></p>
<p>　　</p>
<p style="text-align: left" align="center">&nbsp;转自：<a href="http://www.cnblogs.com/tony-law/archive/2012/03/29/2424045.html">http://www.cnblogs.com/tony-law/archive/2012/03/29/2424045.html</a></p></div><img src ="http://www.cppblog.com/LIULIANG/aggbug/188195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-08-24 22:48 <a href="http://www.cppblog.com/LIULIANG/archive/2012/08/24/188195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WideCharToMultiByte和MultiByteToWideChar函数的用法</title><link>http://www.cppblog.com/LIULIANG/archive/2012/06/07/177980.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Thu, 07 Jun 2012 14:51:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/06/07/177980.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/177980.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/06/07/177980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/177980.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/177980.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p>转自：<a href="http://www.cnblogs.com/gakusei/articles/1585211.html">http://www.cnblogs.com/gakusei/articles/1585211.html</a></p>
<p>为了支持Unicode编码，需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页，在实际应用过程中遇到乱码问题，然后重新阅读《Windows核心编程》，总结出正确的用法。</p><strong>WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。<br />MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。<br /></strong>常用的代码页由CP_ACP和CP_UTF8两个。<br /><strong>使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。<br />使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。<br /></strong>下面是代码实现：<br /><strong>1.&nbsp; ANSI to Unicode<br /></strong>wstring ANSIToUnicode( const string&amp; str )<br />{<br />&nbsp;int&nbsp; len = 0;<br />&nbsp;len = str.length();<br />&nbsp;int&nbsp; unicodeLen = ::MultiByteToWideChar( CP_ACP,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.c_str(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 );&nbsp;&nbsp;<br />&nbsp;wchar_t *&nbsp; pUnicode;&nbsp;&nbsp;<br />&nbsp;pUnicode = new&nbsp; wchar_t[unicodeLen+1];&nbsp;&nbsp;<br />&nbsp;memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));&nbsp;&nbsp;<br />&nbsp;::MultiByteToWideChar( CP_ACP,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.c_str(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (LPWSTR)pUnicode,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unicodeLen );&nbsp;&nbsp;<br />&nbsp;wstring&nbsp; rt;&nbsp;&nbsp;<br />&nbsp;rt = ( wchar_t* )pUnicode;<br />&nbsp;delete&nbsp; pUnicode;&nbsp;<br />&nbsp;<br />&nbsp;return&nbsp; rt;&nbsp;&nbsp;<br />}<br /><strong>2.&nbsp; Unicode to ANSI</strong><br />string UnicodeToANSI( const wstring&amp; str )<br />{<br />&nbsp;char*&nbsp;&nbsp;&nbsp;&nbsp; pElementText;<br />&nbsp;int&nbsp;&nbsp;&nbsp; iTextLen;<br />&nbsp;// wide char to multi char<br />&nbsp;iTextLen = WideCharToMultiByte( CP_ACP,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.c_str(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL );<br />&nbsp;pElementText = new char[iTextLen + 1];<br />&nbsp;memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );<br />&nbsp;::WideCharToMultiByte( CP_ACP,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.c_str(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pElementText,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iTextLen,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL );<br />&nbsp;string strText;<br />&nbsp;strText = pElementText;<br />&nbsp;delete[] pElementText;<br />&nbsp;return strText;<br />}<br />
<div style="text-align: left"><span><strong><br /></strong></span></div>
<p>&nbsp;</p></div><br /><img src ="http://www.cppblog.com/LIULIANG/aggbug/177980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-06-07 22:51 <a href="http://www.cppblog.com/LIULIANG/archive/2012/06/07/177980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C-- 文件操作 </title><link>http://www.cppblog.com/LIULIANG/archive/2012/05/27/176342.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Sun, 27 May 2012 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/05/27/176342.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/176342.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/05/27/176342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/176342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/176342.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 先来看文件操作中的文件。所谓文件（file）一般指存储在外部介质上数据的集合，比如我们经常使用的mp3、mp4、txt、bmp、jpg、 exe、rmvb等等。这些文件各有各的用途，我们通常将它们存放在磁盘或者可移动盘等介质中。那么，为什么这里面又有这么多种格式的文件呢？原因很简 单，它们各有各的用途，区分就在于这些文件里面存放的数据集合所遵循的存储规则不一样。举个例子比如bmp图片文件，为什么他...&nbsp;&nbsp;<a href='http://www.cppblog.com/LIULIANG/archive/2012/05/27/176342.html'>阅读全文</a><img src ="http://www.cppblog.com/LIULIANG/aggbug/176342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-05-27 10:46 <a href="http://www.cppblog.com/LIULIANG/archive/2012/05/27/176342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT类继承图  </title><link>http://www.cppblog.com/LIULIANG/archive/2012/04/10/170811.html</link><dc:creator>BIG森林</dc:creator><author>BIG森林</author><pubDate>Tue, 10 Apr 2012 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/LIULIANG/archive/2012/04/10/170811.html</guid><wfw:comment>http://www.cppblog.com/LIULIANG/comments/170811.html</wfw:comment><comments>http://www.cppblog.com/LIULIANG/archive/2012/04/10/170811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/LIULIANG/comments/commentRss/170811.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/LIULIANG/services/trackbacks/170811.html</trackback:ping><description><![CDATA[<p>QShared<br />|---QGLayoutIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLayoutArrayIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QBoxLayoutIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QToolLayoutIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMainWindowLayoutIterator<br />|---QBrushData<br />|---QDOM_ImplementationPrivate<br />|---QDOM_NodePrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_DocumentTypePrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_DocumentFragmentPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_CharacterDataPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_TextPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_CDATASectionPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_CommentPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_AttrPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_ElementPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_NotationPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_EntityPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_EntityReferencePrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_ProcessingInstructionPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDOM_DocumentPrivate<br />|---QDOM_NodeListPrivate<br />|---QDOM_NamedNodeMapPrivate<br />|---QFontData<br />|---array_data<br />|---QGuardedPtrPrivate<br />|---QImageData<br />|---QMapPrivateBase<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMapPrivate<br />|---QMemoryManagerFont<br />|---QSMCacheItem<br />|---QPalData<br />|---QPenData<br />|---QPixmapData<br />|---QRegionData<br />|---QTextCharFormat<br />|---QTextCustomItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextHorizontalLine<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextLineBreak<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextImage<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextTable<br />|---QSmartPtrPrivate<br />|---QStringData<br />|---QValueListPrivate<br />|---QVariantPrivate<br />|---QCursorData<br />|---QIconSetPrivate<br />|---WhatsThisItem</p>
<p>QLayoutItem&nbsp;&nbsp;<br />|---QSpacerItem<br />|---QWidgetItem<br />|---QLayout<br />|---QTextTableCell</p>
<p>QGArray<br />|---QArray<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPointArray</p>
<p>QGCacheIterator<br />|---QAsciiCacheIterator<br />|---QCacheIterator<br />|---QIntCacheIterator</p>
<p>QGDictIterator<br />|---QAsciiDictIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSignalDictIt<br />|---QDictIterator<br />|---QIntDictIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetIntDictIt<br />|---QPtrDictIterator</p>
<p>QAsyncIO<br />|---QDataSink<br />|---QDataSource<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIODeviceSource</p>
<p>QTextDecoder<br />|---QBig5Decoder<br />|---QEucJpDecoder<br />|---QEucKrDecoder<br />|---QGbkDecoder<br />|---QJisDecoder<br />|---QSjisDecoder<br />|---QTextStatelessDecoder<br />|---QTextCodecFromIODDecoder<br />|---QUtf8Decoder<br />|---QUtf16Decoder</p>
<p>QTextCodec<br />|---QBig5Codec<br />|---QEucJpCodec<br />|---QEucKrCodec<br />|---QGbkCodec<br />|---QJisCodec<br />|---QKoi8Codec<br />|---QHebrewCodec<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QArabicCodec<br />|---QSjisCodec<br />|---QWindowsLocalCodec<br />|---QTextCodecFromIOD<br />|---QSimpleTextCodec<br />|---QLatin1Codec<br />|---QTsciiCodec<br />|---QUtf8Codec<br />|---QUtf16Codec</p>
<p>QByteArray<br />|---QBitArray<br />|---QCString</p>
<p>Qt<br />|---QBrush<br />|---QCanvasItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasSprite<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasPolygonalItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasRectangle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasPolygon<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasLine<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasEllipse<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasText<br />|---QEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTimerEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMouseEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWheelEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QKeyEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFocusEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPaintEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMoveEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QResizeEvent <br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCloseEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QShowEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHideEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIMEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIMComposeEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragResponseEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragLeaveEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QChildEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCustomEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDropEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragMoveEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragEnterEvent<br />|---QGfx//抽象对屏幕具体操作接口<br />|&nbsp;&nbsp;&nbsp;&nbsp; |---QGfxRasterBase<br />|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGfxRaster<br />|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGfxSNAP<br />|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGfxVFb<br />|&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDirectPainterGfx<br />|---QIconViewItem<br />|---QListViewItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---File<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCheckListItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---Root<br />|---QCustomMenuItem<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTearOffMenuItem<br />|---QObject<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGridLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QToolLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMainWindowLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QBoxLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHBoxLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVBoxLayout<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAccel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAction<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QActionGroup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QApplication<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDataPump<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvas<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QClipboard<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorDialogPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCopChannel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDns<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDnsUgleHack<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDnsSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDnsManager<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragObject<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStoredDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragManager<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFileIconProvider<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWindowsIconProvider<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGuardedPtrPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSKeyboardHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSyopyButtonsHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSVr41xxButtonsHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSVFbKeyboardHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSPC101KeyboardHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSTtyKeyboardHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSUsbKeyboardHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLibraryPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QNetworkProtocol<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFtp<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLocalFs<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QNetworkOperation<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QNPInstance<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSenderObject<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QServerSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVNCServer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSServerSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSoundServerSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSServer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSessionManager<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSignalMapper<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSocket<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSoundClient<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSoundServerClient<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSocketNotifier<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSound<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAuServer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSoundServer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSServer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAuServerQWS<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStyleSheet<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QToolTipGroup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTranslator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QUrlOperator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSInputMethod<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSClient<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSManager<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSServerSignalBridge<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFrameEventHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMovieFilePrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSSoundServerData<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QThreadPostEventPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSingleShotTimer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTipManager<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWhatsThisPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSMouseHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAutoMouseHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSMouseHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QYopyTPanelHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCustomTPanelHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVFbMouseHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSMouseHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCalibratedMouseHandler<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVrTPanelHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTPanelHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTSLibHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPPTPanelHandlerPrivate<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QValidator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDoubleValidator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIntValidator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColIntValidator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTimer<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDnsQuery<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QCommonStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWindowsStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCompactStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPlatinumStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMotifStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCDEStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QInterlaceStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMotifPlusStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSGIStyle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCheckBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPushButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QRadioButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QToolButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWhatsThisButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QColorLuminancePicker<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QColorShower<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QComboBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QDial<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFileDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFontDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QInputDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMessageBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPrintDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTabDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWizard<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QFDProgressAnimation<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QFrame<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorPicker<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorShowLabel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetStack<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGrid<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QGroupBox <br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QButtonGroup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHButtonGroup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVButtonGroup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHGroupBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVGroupBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QVBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLabel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWorkspaceChildTitleButton<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTipLabel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QLCDNumber<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMenuBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSpinBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPopupMenu<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QComboBoxPopup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QProgressBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSplitter<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWorkspaceChildTitleLabel<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWorkspaceChild<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QToolBarSeparator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTableView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWellArray<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorWell<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMultiLineEdit<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIconViewItemLineEdit<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QScrollView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIconView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QListBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFileListBox<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QListView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFileListView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTable<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextView<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextBrowser<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QGLWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QHeader<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTableHeader<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QLineEdit<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColNumLineEdit<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QRenameEdit<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QMainWindow<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QNPWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QScrollBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QSemiModal<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFDProgressDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QProgressDialog<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QSizeGrip<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QSlider<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QStatusBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QTabBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QTabWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QToolBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QWorkspaceChildTitleBar<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QWorkspace<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QETWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QShapedPixmapWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QAccessWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QAlphaWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QHideDock<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QClipperWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QSplitterHandle<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QCornerSquare<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QTextDetailPopup<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QArrowWidget<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QFocusDataAccessor<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---Invisible<br />|---QPainter<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDirectPainter<br />|---QPen<br />|---QPixmap<br />|---QStyleSheetItem<br />|---QTableItem<br />|---QMutex<br />|---QThread<br />|---QWaitCondition<br />|---QSemaphore<br />|---QToolTip<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIconViewToolTip<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QHideToolTip<br />|---QWhatsThis<br />|---QWSSoundServer<br />|---QWSCursor<br />|---QDialogPrivate</p>
<p>QIODevice<br />|---QBuffer<br />|---QFile<br />|---QSocket<br />|---QSocketDevice<br />|---QStringBuffer</p>
<p>QPolygonScanner<br />|---QCanvasPolygonScanner<br />|---QGfxRaster</p>
<p>QValueList<br />|---QCanvasItemList<br />|---TrieList<br />|---QStringList<br />|---QValueStack</p>
<p>QUnknownInterface<br />|---QLibraryInterface</p>
<p>QDataStream<br />|---QCopEnvelope</p>
<p>QRangeControl<br />|---QDial<br />|---QScrollBar<br />|---QSlider<br />|---QSpinBox</p>
<p>QXmlDefaultHandler<br />|---QDomHandler</p>
<p>QDomNode<br />|---QDomDocumentType<br />|---QDomDocument<br />|---QDomDocumentFragment<br />|---QDomCharacterData<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDomText<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDomCDATASection<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDomComment<br />|---QDomAttr<br />|---QDomElement<br />|---QDomNotation<br />|---QDomEntity<br />|---QDomEntityReference<br />|---QDomProcessingInstruction</p>
<p>QMimeSource<br />|---QDragObject<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStoredDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QUriDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QColorDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QTextDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QImageDrag<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIconDrag</p>
<p>QEvent,QMimeSource(双继承)<br />|---QDropEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragMoveEvent<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDragEnterEvent</p>
<p>QListBoxItem<br />|---MCItem<br />|---QListBoxText<br />|---QListBoxPixmap</p>
<p>QFontFactory<br />|---QFontFactoryBDF<br />|---QFontFactoryFT</p>
<p>QDiskFontPrivate<br />|---QDiskFontFT</p>
<p>QRenderedFont<br />|---QRenderedFontFT<br />|---QRenderedFontBDF</p>
<p>QCollection<br />|---QGCache<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIntCache<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAsciiCache<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCache<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QFontCache<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPMCache<br />|---QGDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPtrDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QIntDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetIntDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetMapper<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAsciiDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QObjectDictionary<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QSignalDict<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QMemberDict<br />|---QGList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---UrlInfoList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QGDItList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QObjectList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QConnectionList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QSortedList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |---QButtonList<br />|---QGVector<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QVector</p>
<p>QBaseBucket<br />|---QStringBucket<br />|---QAsciiBucket<br />|---QIntBucket<br />|---QPtrBucket</p>
<p>QScreen//显示设备基类,包含显示设备基本描述和操作方式<br />|---QLinuxFbScreen<br />|---QSNAPScreen<br />|---QVFbScreen</p>
<p>QImageFormat<br />|---QGIFFormat<br />|---QMNGFormat<br />|---QPNGFormat</p>
<p>QImageFormatType<br />|---QGIFFormatType<br />|---QMNGFormatType<br />|---QPNGFormatType</p>
<p>QGL<br />|---QGLFormat<br />|---QGLContext<br />|---QGLWidget</p>
<p>QJpUnicodeConv<br />|---QJpUnicodeConv_Unicode_JISX0201<br />|---QJpUnicodeConv_Unicode_ASCII<br />|---QJpUnicodeConv_JISX0221_JISX0201<br />|---QJpUnicodeConv_JISX0221_ASCII<br />|---QJpUnicodeConv_Sun<br />|---QJpUnicodeConv_Microsoft</p>
<p>QGListIterator<br />|---QListIterator<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QObjectListIt<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QConnectionListIt<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCListIt<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWidgetListIt</p>
<p>QMapNodeBase<br />|---QMapNode</p>
<p>QMenuData<br />|---QMenuBar<br />|---QPopupMenu</p>
<p>QNetworkProtocolFactoryBase<br />|---QNetworkProtocolFactory</p>
<p>QPaintDevice<br />|---QPicture<br />|---QPixmap<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QBitmap<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QCanvasPixmap<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QwsPixmap<br />|---QPrinter<br />|---QPSPrinter<br />|---QWidget</p>
<p>QPNGImageWriter<br />|---QPNGImagePacker</p>
<p>QTextParagraph<br />|---QRichText</p>
<p>QStrListBase<br />|---QStrList<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStrIList</p>
<p>QStrVec<br />|---QStrVec<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QStrIVec</p>
<p>QTextEncoder<br />|---QTextStatelessEncoder<br />|---QUtf16Encoder</p>
<p>QTextStream<br />|---QTextIStream<br />|---QTextOStream</p>
<p>QMutexPrivate<br />|---QRMutexPrivate</p>
<p>QUrl<br />|---QUrlOperator</p>
<p>QWSCommand<br />|---QWSIdentifyCommand<br />|---QWSCreateCommand<br />|---QWSRegionNameCommand<br />|---QWSRegionCommand<br />|---QWSRegionMoveCommand<br />|---QWSRegionDestroyCommand<br />|---QWSChangeAltitudeCommand<br />|---QWSRequestFocusCommand<br />|---QWSAddPropertyCommand<br />|---QWSSetPropertyCommand<br />|---QWSRemovePropertyCommand<br />|---QWSGetPropertyCommand<br />|---QWSSetSelectionOwnerCommand<br />|---QWSConvertSelectionCommand<br />|---QWSDefineCursorCommand<br />|---QWSSelectCursorCommand<br />|---QWSGrabMouseCommand<br />|---QWSGrabKeyboardCommand<br />|---QWSPlaySoundCommand<br />|---QWSQCopRegisterChannelCommand<br />|---QWSQCopSendCommand<br />|---QWSSetIMInfoCommand<br />|---QWSIMMouseCommand<br />|---QWSResetIMCommand<br />|---QWSSetIMFontCommand</p>
<p>QWSDecoration<br />|---QWSDefaultDecoration<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSHydroDecoration<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSKDE2Decoration<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSKDEDecoration<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSWindowsDecoration<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QWSBeOSDecoration</p>
<p>QAutoMouseSubHandler<br />|---QAutoMouseSubHandler_intellimouse<br />|---QAutoMouseSubHandler_serial<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAutoMouseSubHandler_mousesystems<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QAutoMouseSubHandler_ms<br />|---QAutoMouseSubHandler_intellimouse</p>
<p>QXmlReader<br />|---QXmlSimpleReader</p>
<p>QEffects<br />|---QAlphaWidget<br />|---QRollEffect</p>
<p>QString<br />|---QCIString</p>
<p>QFont<br />|---QFont_Private</p>
<p>QScreenCursor<br />|---QVFbScreenCursor</p>
<p>QImageConsumer<br />|---QImageIOFrameGrabber</p>
<p>QMultiLineEditCommand<br />|---QBeginCommand<br />|---QEndCommand<br />|---QDelTextCmd<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QInsTextCmd</p>
<p>QPSPrinterFontPrivate<br />|---QPSPrinterFontTTF<br />|---QPSPrinterFontPFA<br />|---QPSPrinterFontPFB<br />|---QPSPrinterFontNotFound<br />|---QPSPrinterFontAsian<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPSPrinterFontJapanese<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPSPrinterFontKorean<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPSPrinterFontTraditionalChinese<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---QPSPrinterFontSimplifiedChinese</p>
<p>QWSSoundServerProvider<br />|---QWSSoundServerBucket<br />|---QWSSoundServerStream</p>
<p>&nbsp;<br />转载：<a href="http://blog.163.com/sxs_solo/blog/static/263333820086410169909/">http://blog.163.com/sxs_solo/blog/static/263333820086410169909/</a></p><img src ="http://www.cppblog.com/LIULIANG/aggbug/170811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/LIULIANG/" target="_blank">BIG森林</a> 2012-04-10 21:48 <a href="http://www.cppblog.com/LIULIANG/archive/2012/04/10/170811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>