<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>C0EEBDA1-leajian</title><link>http://www.mculee.cn/</link><description>李健的博客,leajian,李剑</description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80722</generator><language>zh-CN</language><copyright>Copyright 2008-2009 C0EEBDA1. Some Rights Reserved. 备案号:京ICP备09020681号</copyright><pubDate>Fri, 08 Jul 2011 15:05:42 +0800</pubDate><item><title>Linux下的fbcon的rotate</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/102.html</link><pubDate>Fri, 08 Jul 2011 15:05:19 +0800</pubDate><guid>http://www.mculee.cn/post/102.html</guid><description><![CDATA[<p>&nbsp;在bootargs中加入：</p><div>fbcon=rotate:1</div><div>可旋转虚拟终端。</div><div>&nbsp;</div><div>在Linux启动之后，可以在：</div><div>/sys/devices/virtual/graphics/fbcon</div><div>目录中操作rotate文件，来动态控制虚拟终端的旋转变化。</div><div>&nbsp;</div>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/102.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=102</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=102&amp;key=87565cce</trackback:ping></item><item><title>TP-Link TL-WN321G+无线网卡在Linux 2.6下无法正确识别</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/101.html</link><pubDate>Thu, 24 Mar 2011 15:45:32 +0800</pubDate><guid>http://www.mculee.cn/post/101.html</guid><description><![CDATA[<p>&nbsp;最近有客户反馈在Linux 2.6下，之前配备的TP-Link TL-WN321G+网卡没办法连入路由器的问题。</p><p>看了一下具体的症状，在插上USB无线网卡之后，内核会print下面的讯息：</p><p><p>usb 1-1.1: new full speed USB device using s3c2410-ohci and address 6</p><p>usb 1-1.1: New USB device found, idVendor=148f, idProduct=2573</p><p>usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0</p><p>usb 1-1.1: Product: 54M.USB.......</p><p>usb 1-1.1: Manufacturer: Ralink</p><p>usb 1-1.1: configuration #1 chosen from 1 choice</p><p><span style="color: rgb(255, 0, 0); ">phy6 -&gt; rt2500usb_init_eeprom: Error - Invalid RT chipset detected.</span></p><p><span style="color: rgb(255, 0, 0); ">phy6 -&gt; rt2x00lib_probe_dev: Error - Failed to allocate device.</span></p><p>wmaster0 (rt73usb): not using net_device_ops yet</p><p>wlan0 (rt73usb): not using net_device_ops yet</p><p>其中， 红色的部分是报告的错误。奇怪的是，虽然内核报告了错误，但是仍然可以识别到wlan0，只不过，其实这个wlan0是没有通信能力的。</p><p>在网上找了一些资料，发现主要是rt2500搞的鬼！rt2500和rt73的PID和VID相同，Linux误使用了rt2500的driver，导致初始化失败。</p><p>在内核配置过程中，取消rt2500的支持，搞定！！</p><p>&nbsp;</p><p>&nbsp;</p></p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/101.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=101</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=101&amp;key=6da1afca</trackback:ping></item><item><title>Fireworks在嵌入式系统里的另类应用。。。</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/99.html</link><pubDate>Wed, 23 Feb 2011 08:36:00 +0800</pubDate><guid>http://www.mculee.cn/post/99.html</guid><description><![CDATA[<p>在嵌入式应用中，贴图式GUI在很多场合都有应用，做好一张图之后，图中如果有热点区域，如何快速导出这些热点区域，是个问题。</p><p>使用Firework，可以方便的在图中绘制切片，可以首先利用这个功能，将所有热点绘制成切片，然后导出，导出的时候，选择&ldquo;CSS 层&rdquo;</p><p>，源选择&ldquo;Fireworks切片&rdquo;</p><p><img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="595" alt="clip_image002" width="584" border="0" src="http://www.mculee.cn/upload/2011/2/201102231630047334.jpg" /></p><p>这样，导出来的htm文件中，每一个切片都是以一个&lt;div&gt;标签来表达，其位置和大小信息一目了然，接下来，只需要简单的将div转换成Keymap即可</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/99.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=99</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=99&amp;key=a267b5cb</trackback:ping></item><item><title>freetype在S+core平台上的移植的另一法（适用于几乎任何gcc为基础的平台哦！）</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/98.html</link><pubDate>Wed, 23 Feb 2011 08:31:00 +0800</pubDate><guid>http://www.mculee.cn/post/98.html</guid><description><![CDATA[<p>freetype提供了完整的automake机制，之前并没有考虑使用它。今天试了一下，没问题，完全可以使用automake编译在S+core平台下工作的freetype出来。方法如下：</p><p>configure虽然提供了--host来提供交叉编译的方法，但是score-elf-gcc不能直接通过configure的测试，原因如下：</p><p>score-elf-gcc虽然是标准的gcc，但是它自身有如下特性：</p><p>&middot; 默认并非小端数据格式</p><p>&middot; 默认并非S+core7 CPU</p><p>&middot; 默认使用的C库是newlib，这个C库的特点是，如果需要链接可执行程序，用户需要提供一个libgloss.c</p><p>虽然我们编译freetype只是需要得到一个library，看起来好像不需要gcc做链接，但是configure在测试gcc的过程中，需要验证gcc是否可以正常产生可执行文件，而针对此，默认的score-elf-gcc肯定是无法通过测试的。</p><p>所以，首先需要对score-elf-toolchain做如下处理：</p><p>在IDE中找到libgloss.c文件，并编译：</p><p>score-elf-gcc -c -mel -mscore7 libgloss.c</p><p>将得到一个libgloss.o，然后将其制作成一个.a的静态库：</p><p>score-elf-ar q libgloss.a libgloss.o</p><p>然后，将libgloss.a安装到score-elf-toolchain中：</p><p>cp libgloss.a /usr/local/score/4.2.1/score-elf/lib/mel/</p><p>接着，设置CFLAGS和LDFLAGS两个环境变量，让score-elf-gcc的默认参数符合SPCE3200：</p><p>export CFLAGS='-O2 -mel -mscore7'</p><p>export LDFLAGS='-mel -mscore7 -lm -lc -lgcc -lgloss'</p><p>至此，准备工作已经就绪，接下来就可以编译freetype了：</p><p>./configure --host=score-elf --without-zlib --prefix=$PWD/_install</p><p>make</p><p>make install</p><p>在_install目录中，找到lib下的libfretype.a即可！</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/98.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=98</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=98&amp;key=689714dc</trackback:ping></item><item><title>海大的一个LED键盘模组的引脚定义</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/96.html</link><pubDate>Sun, 30 Jan 2011 14:54:37 +0800</pubDate><guid>http://www.mculee.cn/post/96.html</guid><description><![CDATA[<p>总是忘记引脚定义，这下子要记下来：</p><p>&nbsp;</p><p>IOA高8位，段码，1点亮</p><p>&nbsp;*8*<br />*&nbsp;&nbsp; *<br />D&nbsp;&nbsp; 9<br />*&nbsp;&nbsp; *<br />&nbsp;*E*<br />*&nbsp;&nbsp; *<br />C&nbsp;&nbsp; A<br />*&nbsp;&nbsp; *<br />&nbsp;*B*&nbsp; *F</p><p>LED:<br />8&nbsp; 9&nbsp; A&nbsp; B&nbsp; C&nbsp; D</p><p><br />IOB低7位，位选，0有效<br />坐起第一个数码管为0位，LED为6位</p><p>IOB高6位，按键，按下为0</p><p>SETUP A<br />RUN&nbsp;&nbsp; B<br />LEFT&nbsp; C<br />RIGHT D<br />UP&nbsp;&nbsp;&nbsp; E<br />DOWN&nbsp; F<br />&nbsp;</p>]]></description><category>杂文</category><comments>http://www.mculee.cn/post/96.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=96</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=96&amp;key=6849cea8</trackback:ping></item><item><title>久违的博客</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/95.html</link><pubDate>Sat, 11 Dec 2010 03:09:00 +0800</pubDate><guid>http://www.mculee.cn/post/95.html</guid><description><![CDATA[<p>很久没写博客了，最近开始玩微博，因为微博比较简单，一句话的事，一句话能成事，一句话能坏事。。。嗨，怎么跑小品了。</p><p>微博的确是个好东西，不过，回头看了一下我的博客，还是不能荒废呀。以往太在意发表的博文的质量，必须原创，这几天玩微博又有了心得，</p><p>不管是微博还是博客，管它是不是有意义呢，反正是自己的领地，我说的就是我的，不管是原创，还是心情，还是胡说八道，还是转帖，还是剽窃，总之都是我的财富。。。</p><p>博客，我回来了^_^</p>]]></description><category>杂文</category><comments>http://www.mculee.cn/post/95.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=95</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=95&amp;key=58d1f1c6</trackback:ping></item><item><title>freetype在Non-OS平台下的使用（以SPCE3200为例）</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/94.html</link><pubDate>Fri, 06 Aug 2010 02:06:00 +0800</pubDate><guid>http://www.mculee.cn/post/94.html</guid><description><![CDATA[<p>以下以移植到SPCE3200为例</p><p>&nbsp;</p><p>从http://www.freetype.org/下载代码。</p><p>可以下载总计三份资料：</p><p>ft241.zip freetype源码</p><p>ftdmo241.zip freetype demo源码</p><p>ftdoc241.zip freetype文档</p><p>&nbsp;</p><p>把freetype源码解压，可以看到其中有src、include和builds几个目录（当然还有其他的，暂时不用关心）</p><p>用S+core IDE新建一个library工程，并将src和include复制到工程下</p><p>接下来，需要将src和include中的文件添加到工程。</p><p>不过，不能将所有文件全部添加，因为其中某些.c已经将其他的.c include进来了。</p><p>具体该添加哪些文件，需要参考在builds\win32\visualc\目录下的vc的工程。</p><p>打开这个vc的工程，参照Source Files 中的文件列表，将这些文件添加到S+core project里。</p><p><b><img title="clip_image002" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="170" alt="clip_image002" width="190" border="0" src="http://www.mculee.cn/upload/2010/8/201008121659266437.jpg" /></b></p><p>然后，在S+core IDE内设置Additional Directories，将include目录添加进来。</p><p><b><img title="clip_image004" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="201" alt="clip_image004" width="237" border="0" src="http://www.mculee.cn/upload/2010/8/201008121659308620.jpg" /></b></p><p>然后编译即可。</p><p>我编译的时候，出现找不到#include后面的宏的情况，可能是因为编译器在处理预编译指令的时候顺序问题造成的。</p><p>修改include\freetype\config\ftheader.h头文件，在里面包含：</p><p>#include &lt;freetype\internal\internal.h&gt;</p><p>再编译，没有发现其他问题。</p><p>编译之后可以得到freetype的library。</p><p>&nbsp;</p><p>freetype因为在内部并没有涉及到任何有关OS的特性的操作，所以在Non-OS平台下可以非常方便的使用。</p><p>另外，freetype原生支持memory font和filesystem font两种形态的TrueType字库文件，并且可以允许用户自行编写I/O function对任意形式的字库文件进行存取。</p><p>memory font使用起来比较方便，只需要把字库文件一并链接到程序中，就可以访问，不需要增加额外的软件包进来。</p><p>这一点，也可以保证不管是在哪个平台下，只要ram或者rom够大，就可以先来尝试freetype的魅力了。</p><p>&nbsp;</p><p>如果在SPCE3200平台下使用freetype去装载sd card上的ttf文件，需要有ufat的支持，并且，freetype使用的是流式的文件操作函数（fopen、fread、fwrite之类的），而ufat默认没有提供流式的文件操作函数，所以必须将ufat更新到ufatv1.2的版本，才可以正常使用！</p><p>&nbsp;</p><p>对freetype的使用，有相关doc可以参考。这里贴一段小范例程序，供参考</p><p>&nbsp;</p><p>#include &lt;ft2build.h&gt;</p><p>#include FT_FREETYPE_H</p><p>#include &quot;Resource.h&quot;</p><p>#include &quot;TFT\TFT_API.h&quot;</p><p>#include &quot;UFAT\UFAT.h&quot;</p><p>#include &lt;stdio.h&gt;</p><p>#include &lt;string.h&gt;</p><p>#include &lt;math.h&gt;</p><p>typedef UINT16 UNI_CHAR;</p><p>//下面两个函数是SPCE3200平台下的文件系统中提供的unicode和GB2312转换的API</p><p>//因为在TrueType font中，是以Unicode为直接支持的编码的。</p><p>int uni2char(UNI_CHAR uni, unsigned char *out);</p><p>int char2uni(const char **rawstring, UNI_CHAR * uni);</p><p>//下面的函数可以将获取到的某个字符的bitmap画到LCD上</p><p>void draw_bitmap(WIN_HANDLE win, FT_Face face, FT_Int x, FT_Int y)</p><p>{</p><p>COLOR bkColor = TFT_GetColor(win);</p><p>FT_Int xoff = face-&gt;glyph-&gt;bitmap_left;</p><p>FT_Int yoff = face-&gt;glyph-&gt;metrics.vertAdvance / 64 - face-&gt;glyph-&gt;bitmap_top;</p><p>// FT_Int yoff = face-&gt;glyph-&gt;bitmap_top - face-&gt;glyph-&gt;metrics.horiBearingY / 64;</p><p>FT_Int i, j, p, q;</p><p>FT_Int x_max = x + face-&gt;glyph-&gt;bitmap.width;</p><p>FT_Int y_max = y + face-&gt;glyph-&gt;bitmap.rows;</p><p>for(j = y, q = 0; j &lt; y_max; j++, q++)</p><p>{</p><p>unsigned char *pData = face-&gt;glyph-&gt;bitmap.buffer + q * face-&gt;glyph-&gt;bitmap.width;</p><p>for(i = x, p = 0; i &lt; x_max; i++, p++)</p><p>{</p><p>if(*pData &gt; 0x7F)</p><p>TFT_PutPixel(win, i + xoff, j + yoff);</p><p>pData++;</p><p>}</p><p>}</p><p>#if 0</p><p>for ( i = x, p = 0; i &lt; x_max; i++, p++ )</p><p>{</p><p>for ( j = y, q = 0; j &lt; y_max; j++, q++ )</p><p>{</p><p>COLOR drawColor = COLOR_BLACK;</p><p>int nIndex = q * face-&gt;glyph-&gt;bitmap.width + p;</p><p>unsigned char nData = face-&gt;glyph-&gt;bitmap.buffer[nIndex];</p><p>drawColor = nData;// | 0xFF00;</p><p>TFT_SetColor(win, drawColor);</p><p>TFT_PutPixel(win, i + xoff, j + yoff);</p><p>}</p><p>}</p><p>#endif</p><p>TFT_SetColor(win, bkColor);</p><p>}</p><p>//下面这个函数可以显示一个字符串，其中使用到了FT_Load_Char，该函数用于获取到某个字符的bitmap</p><p>void putString(WIN_HANDLE win, FT_Face face, int x, int y, const char *string)</p><p>{</p><p>int cx = x;</p><p>while(*string)</p><p>{</p><p>UNI_CHAR ch;</p><p>char2uni(&amp;string, &amp;ch);</p><p>FT_Load_Char(face, ch, FT_LOAD_RENDER);</p><p>int w = face-&gt;glyph-&gt;metrics.horiAdvance / 64;</p><p>if((cx + w) &gt;= TFT_WIDTH)</p><p>{</p><p>cx = 0;</p><p>y += face-&gt;glyph-&gt;metrics.vertAdvance / 64;</p><p>}</p><p>draw_bitmap(win, face, cx, y);</p><p>cx += w;</p><p>if(y &gt;= TFT_HEIGHT)</p><p>break;</p><p>}</p><p>}</p><p>&nbsp;</p><p>//====================================================</p><p>// 语法格式：int main(void)</p><p>// 功能描述: 主函数</p><p>// 入口参数: 无</p><p>// 出口参数: 无</p><p>//====================================================</p><p>int main(void)</p><p>{</p><p>int FONT_SIZE = 32;</p><p>/************************************************/</p><p>/* Attach ISRs. See User_IRQ.c for details */</p><p>/************************************************/</p><p>AP_Init_SysIRQs();</p><p>/************************************************/</p><p>/* TODO: add your code here */</p><p>/************************************************/</p><p>fs_init();</p><p>while(fs_mount(0));</p><p>chdir(&quot;A:\\&quot;);</p><p>FT_Library library; /* handle to library */</p><p>FT_Error error;</p><p>FT_Face face; /* handle to face object */</p><p>// 首先初始化FreeType library</p><p>error = FT_Init_FreeType(&amp;library); /* initialize library */</p><p>// 然后从sd card 装载一个TrueType字体</p><p>error = FT_New_Face(library,</p><p>&quot;A:\\Stxihei.ttf&quot;,</p><p>0, &amp;face);</p><p>// 设置字体大小</p><p>error = FT_Set_Char_Size(face, FONT_SIZE * 64, 0,</p><p>64, 64 ); /* set character size */</p><p>// 下面这段代码可以用于对字体进行变形</p><p>FT_Matrix matrix; /* transformation matrix */</p><p>FT_Vector pen; /* untransformed origin */</p><p>pen.x = 0;//30 * 64;</p><p>pen.y = 0;//( target_height - 30 ) * 64;</p><p>double angle = ( -0.0 / 360 ) * 3.14159 * 2;</p><p>matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );</p><p>matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );</p><p>matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );</p><p>matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );</p><p>// FT_Set_Transform( face, &amp;matrix, &amp;pen );</p><p>&nbsp;</p><p>// 初始化LCD并显示字符</p><p>TFT_Init();</p><p>WIN_HANDLE win = TFT_CreateWindowEx(0, 0, TFT_WIDTH, TFT_HEIGHT, COLOR_BLACK);</p><p>putString(win, face, 0, 0, &ldquo;测试一下哈test1234567890&rdquo;);</p><p>return 0;</p><p>}</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/94.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=94</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=94&amp;key=77efe51a</trackback:ping></item><item><title>在QT下为开发板的键盘编写输入插件</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/93.html</link><pubDate>Tue, 08 Jun 2010 01:03:00 +0800</pubDate><guid>http://www.mculee.cn/post/93.html</guid><description><![CDATA[<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">网上也有相同的文章，但在QtCreator下不知道如何跟着网上的介绍来操作，所以写了此篇文章，照着做，保证有效 ^_^</span></p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left">&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">创建</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Qt</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的键盘插件，重点是创建两个类：</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">一个基于</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QObject</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">和</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QWSKeyboardHandler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">派生的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">键盘处理类（</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">）</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">一个基于</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QKbdDriverPlugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">派生的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">键盘插件类（</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">）</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类的主要作用是完成对底层键盘设备的打开、读取等操作，并将读取到的键值映射为</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Qt</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">支持的键值。</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类的主要作用是与外部接口（因为在一个动态链接库中，</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类是导出的），在该类中，去创建</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类的对象。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">OK</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">，开始实施：</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">1. </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">创建一个动态库工程，并生成一个类，假设叫做：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">sbox4x4</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">，这个类就是我们的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="424" alt="clip_image002" width="596" border="0" v:shapes="_x0000_i1025" src="http://www.mculee.cn/upload/2010/6/201006080851557344.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image004" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="395" alt="clip_image004" width="559" border="0" v:shapes="_x0000_i1026" src="http://www.mculee.cn/upload/2010/6/201006080851567124.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image006" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="395" alt="clip_image006" width="559" border="0" v:shapes="_x0000_i1027" src="http://www.mculee.cn/upload/2010/6/201006080851577064.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image008" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="395" alt="clip_image008" width="559" border="0" v:shapes="_x0000_i1028" src="http://www.mculee.cn/upload/2010/6/201006080851585408.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">2</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">. </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">实现</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">修改</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">sbox4x4</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">handler</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">.h</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">加入下面三个头文件</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">#include &lt;QObject&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">#include &lt;QtGui/QWSKeyboardHandler&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">#include &lt;QSocketNotifier&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">将</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">Sbox4x4</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">修改成</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> QObject</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">和</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">QWSKeyboardHandler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">并加入</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Q_OBJECT</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">声明</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">并在类中添加一个</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">void kbdReadyRead()</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">slot</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">函数</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">用于将来当键盘设备可读时读取键值</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">class SBOX4X4SHARED_EXPORT Sbox4x4Handler </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>:public QObject, public QWSKeyboardHandler </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Q_OBJECT </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">public: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Sbox4x4Handler(const QString &amp;device = QString(&quot;/dev/kbd&quot;), QObject *parent = 0); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>~Sbox4x4Handler(); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">private: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int kbdFd; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>QSocketNotifier *notifier; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">private slots: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>void kbdReadyRead(); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">}; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">其中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QSocketNotifier </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">用于对键盘设备文件进行状态检测</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">kbdFd</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">用于保存键盘设备文件打开之后的描述符。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">接下来</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">修改</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">sbox4x4handler.cpp</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">文件</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">完成上述几个函数</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">首先包含必要的头文件</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">如</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;stdio.h&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;stdlib.h&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;unistd.h&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;fcntl.h&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;errno.h&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在构造函数中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">完成对设备的打开操作</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">并创建</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QSocketNotifier</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">对象</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">永远检测设备的读状态</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Sbox4x4Handler::Sbox4x4Handler(const QString &amp;device, QObject *parent) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>:QObject(parent), QWSKeyboardHandler() </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>setObjectName(&quot;SAPP 4x4 Keyboard Handler&quot;); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>this-&gt;kbdFd = ::open(device.toAscii().constData(), O_RDONLY); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(this-&gt;kbdFd &lt; 0) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>this-&gt;notifier = new QSocketNotifier(this-&gt;kbdFd, QSocketNotifier::Read, this); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>connect(this-&gt;notifier, SIGNAL(activated(int)), this, SLOT(kbdReadyRead())); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">析构函数中，关闭设备文件</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Sbox4x4Handler::~Sbox4x4Handler() </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(this-&gt;kbdFd &gt;= 0) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>::close(this-&gt;kbdFd); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">kbdReadyRead</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">槽函数中，完成对设备文件的读取和键值映射：</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">void Sbox4x4Handler::kbdReadyRead() </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>char key; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">读取设备文件</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(read(this-&gt;kbdFd, &amp;key, sizeof(key)) != sizeof(key)) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Qt::KeyboardModifiers modifiers = Qt::NoModifier; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// unicode</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">用于保存映射之后的字符</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int unicode = 0x0000; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>// keycode</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">用于保存映射之后的</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Qt::Key</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类型的键值</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int keycode = 0; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>switch(key) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 0: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_0; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '0'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 1: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_1; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '1'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 2: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_2; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '2'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 3: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_3; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '3'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 4: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_4; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '4'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 5: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_5; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '5'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 6: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_6; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '6'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 7: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_7; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '7'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 8: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_8; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '8'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 9: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_9; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = '9'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 10: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_A; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'A'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 11: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>keycode = Qt::Key_B; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'B'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 12: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_C; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'C'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 13: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_D; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'D'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 14: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_E; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'E'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>case 15: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keycode = Qt::Key_F; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>unicode = 'F'; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>default: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>this-&gt;processKeyEvent(unicode, keycode, modifiers, 1, false); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">}</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">OK</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QWSKeyboardHandler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的派生类处理完毕。接下来</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">需要创建</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QKbdDriverPlugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的派生类。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">首先创建一个新的</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">C++ Class</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image010" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="424" alt="clip_image010" width="596" border="0" v:shapes="_x0000_i1029" src="http://www.mculee.cn/upload/2010/6/201006080851591373.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">假设取名为</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Sbox4x4Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">，</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Base Class</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">输入</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QKbdDriverPlugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;; mso-bidi-font-family: system; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><img title="clip_image012" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="449" alt="clip_image012" width="603" border="0" v:shapes="_x0000_i1030" src="http://www.mculee.cn/upload/2010/6/201006080851592501.jpg" /></span></b><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Sbox4x4Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">重点是重载</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QKbdDriverPlugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">基类中的</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">create</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">和</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">keys</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">注意</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Qt Creator </span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">自动生成的类定义中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">包含的头文件不正确</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">直接包含</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QKbdDriverPlugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">会提示找不到</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">需要加上</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QtGui/QKbdDriverPlugin </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &lt;QtGui/QKbdDriverPlugin&gt; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">class Sbox4x4Plugin : public QKbdDriverPlugin </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Q_OBJECT </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">public: </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Sbox4x4Plugin(); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>QWSKeyboardHandler *create(const QString &amp;driverName, const QString &amp;deviceName = QString(&quot;/dev/kbd&quot;)); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>QStringList keys() const; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">};</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">sbox4x4plugin.cpp</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">文件中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">实现上述函数</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">：</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">不要忘记包含</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">sbox4x4handler.h</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">头文件</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">因为在</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">需要创建</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Sbox4x4Handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的类的对象。</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">#include &quot;sbox4x4handler.h&quot; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">构造函数不需要做什么，保留为空</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Sbox4x4Plugin::Sbox4x4Plugin() </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">create</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">中</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">重点是要创建一个自己的</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">handler</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类对象</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">，</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">也就是</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">sbox4x4</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的对象</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">QWSKeyboardHandler *Sbox4x4Plugin::create(const QString &amp;driverName, const QString &amp;deviceName) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>if(driverName.toLower() == &quot;sbox4x4&quot;) </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new Sbox4x4Handler(deviceName); </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">return NULL; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">在</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">keys</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">函数中，返回插件的名字即可</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QStringList Sbox4x4Plugin::keys() const </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">{ </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>return QStringList() &lt;&lt; &quot;sbox4x4&quot;; </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">} </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">最后，不要忘记将</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">sbox4x4</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">这个库中的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">类导出</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Q_EXPORT_PLUGIN2(sbox4x4, Sbox4x4Plugin);</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">OK</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">，编译，大功告成。</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><b><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">使用：</span></b><b><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span></b><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">使用方法很简单，</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">首先，将编译出的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">libsbox4x4.so</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">复制到</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">/usr/local/Trolltech/QtEmbedded-4.6.2-arm/plugins/kbddrivers</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">目录下（没有目录则创建）</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">然后，增加一个</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">QWS_KEYBOARD</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">环境变量：</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">export QWS_KEYBOARD=sbox4x4:/dev/kbd </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">sbx4x4</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">是库的名字，冒号后面是输入设备。</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">将来，</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">sbox4x4</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">和</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">/dev/kbd</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">将被传递到</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">Sbox4x4Plugin</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">的</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">create</span><span style="font-size: 12pt; color: black; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: tahoma; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn">函数中，用于创建键盘处理对象。</span><span style="font-size: 12pt; color: black; font-family: &quot;Courier New&quot;; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt; mso-ansi-language: zh-cn"> </span><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal"><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p></p><p>&nbsp;</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/93.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=93</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=93&amp;key=4cee1fdf</trackback:ping></item><item><title>在arm-linux-gcc 3.4.1下编译 qt-embedded-4.6.2</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/92.html</link><pubDate>Fri, 04 Jun 2010 10:13:00 +0800</pubDate><guid>http://www.mculee.cn/post/92.html</guid><description><![CDATA[<p>arm-linux-gcc 3.4.1算是一个已经比较旧的版本了，现在我们在Linux 2.6.29环境下，用的是4.3.2的编译器。</p><p>不过，因为还有一个S3C2410 + Linux 2.4.18的产品线，所以仍然没有舍弃 3.4.1。</p><p>之前在Linux 2.4.18下，跑的是4.3.5的Qtopia，效果还算不错，但是发现新版本的qt-embedded中，有了一些比较不错的特性，比如，在一个GuiServer程序中使用QProcess以GuiClient的方式调用另外一个QT应用程序，不再有两个程序抢夺唯一的一个fb的现象了，使得桌面程序在新版本下实现起来异常简单。</p><p>所以，决定将Linux 2.4.18平台下的qt升级到目前的最新版，4.6.2</p><p>&nbsp;</p><p>首先，在编译QtEmbedded之前，需要在arm-linux-gcc 3.4.1下编译 tslib。</p><p><font color="#0000ff"><strong>Step 1.</strong></font></p><p>export CC=arm-linux-gcc</p><p>./autogen.sh <br />echo &ldquo;ac_cv_func_malloc_0_nonnull=yes&rdquo;&gt;arm-linux.cache <br />./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no --prefix=$PWD/_install <br />注释掉config.h文件最后处的： <br />#define malloc&nbsp;&nbsp;&nbsp; rpl_malloc <br />make <br />make install</p><p>在_install目录下将生成所需的文件。</p><p>&nbsp;</p><p><strong>开发板： <br /></strong>需在开发板上设置如下环境变量： <br />TSLIB_CALIBFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 校准数据文件的路径 <br />TSLIB_CONFFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tslib配置文件ts.conf的路径 <br />TSLIB_PLUGINDIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tslib插件路径，指向lib/ts <br />TSLIB_FBDEVICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LCD设备文件 <br />TSLIB_CONSOLEDEVICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制台设备文件 <br />TSLIB_TSDEVICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 触摸屏设备文件</p><p>&nbsp;</p><p>OK，tslib编译完毕。</p><p><strong><font color="#0000ff">Step 2.</font></strong></p><p>接下来可以编译QtEmbedded了。不过，记得在编译之前，一定要<strong><font color="#ff0000">unset CC</font></strong>，否则编译qt会出问题！</p><p>3.4.1下编译qt时需要指定tslib的路径，否则编译出现错误：</p><p>../../src/qt-everywhere-opensource-src-4.6.2/configure -release -no-largefile -no-stl -no-qt3support -no-cups -no-nis -no-opengl -no-openvg -embedded arm -qt-mouse-linuxtp -qt-mouse-tslib -I /home/lijian/QT/build/tslib-1.0-with3.4.1armgcc/_install/include -L /home/lijian/QT/build/tslib-1.0-with3.4.1armgcc/_install/lib -D__ARM_ARCH_5TEJ__</p><p>最后的-D__ARM_ARCH_5TEJ__不确定，对于2410来说，或许应该换成-D__ARM_ARCH_4T__（实际上，我本人在编译QtEmbedded的时候，并没有在最后加这条，接下来出了问题之后直接修改的部分Makefile，也可以用）</p><p>如果configure的时候没有加这句-D，编译的时候可能出现后面的第二种错误。</p><p><strong>出现下面的错误：</strong></p><p>/home/lijian/QT/source/qt-everywhere-opensource-src-4.6.2/src/gui/text/qfontengine_ft.cpp: In member function `bool QFontEngineFT::init(QFontEngine::FaceId, bool, QFontEngineFT::GlyphFormat)':</p><p>/home/lijian/QT/source/qt-everywhere-opensource-src-4.6.2/src/gui/text/qfontengine_ft.cpp:696: warning: converting to `int' from `qreal'</p><p>{standard input}: Assembler messages:</p><p>{standard input}:778: Error: register or shift expression expected -- `orr r3,r2,lsl#16'</p><p>{standard input}:789: Error: register or shift expression expected -- `orr r2,r3,lsl#16'</p><p>{standard input}:7748: Error: register or shift expression expected -- `orr r3,r0,lsl#16'</p><p>{standard input}:7761: Error: register or shift expression expected -- `orr r1,r0,lsl#16'</p><p>make[1]: *** [.obj/release-shared-emb-arm/qfontengine_ft.o] 错误 1</p><p>make[1]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/src/gui'</p><p>make: *** [sub-gui-make_default-ordered] 错误 2</p><p>解决办法：</p><p><strong>修改src/3rdparty/freetype/include/freetype/config/ftconfig.h文件的第330行：</strong></p><p>&quot;orr %0, %2, lsl #16\n\t&quot; /* %0 |= %2 &lt;&lt; 16 */</p><p>修改为：</p><p>&quot;orr %0, <b><font color="#ff0000">%0</font>, </b>%2, lsl #16\n\t&quot; /* %0 |= %2 &lt;&lt; 16 */</p><p><strong>第二种错误：</strong></p><p>In file included from ./config.h:26,</p><p>from ../JavaScriptCore/pcre/pcre_compile.cpp:44:</p><p>../JavaScriptCore/wtf/Platform.h:338:6: #error &quot;<b><font color="#ff0000">Not supported ARM architecture</font>&quot;</b></p><p>make[1]: *** [obj/release/pcre_compile.o] Error 1</p><p>make[1]: Leaving directory `/usr/local/qte4.6-arm/src/3rdparty/webkit/WebCore'</p><p>make: *** [sub-webkit-make_default-ordered] Error 2</p><p><strong>我的解决办法是，直接修改src/3rdparty/webkit/WebCore/Makefile，在cflags中加入-D__ARM_ARCH_4T__</strong></p><p><strong>修改src/script/Makefile，同上</strong></p><p>如果configure时已经有此选项，应该不会出现这个问题</p><p><strong>第三个错误：</strong></p><p>这个错误发生在最后编译example和demo的过程中，如果在configure的时候取消了example，则可以跳过。</p><p>/home/.usr_local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/bin/ld: warning: libts-0.0.so.0, needed by /home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so, not found (try using -rpath or -rpath-link)</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_close'</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_config'</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_read'</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_read_raw'</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_open'</p><p>/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_fd'</p><p>collect2: ld returned 1 exit status</p><p>make[3]: *** [animatedtiles] 错误 1</p><p>make[3]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples/animation/animatedtiles'</p><p>make[2]: *** [sub-animatedtiles-make_default] 错误 2</p><p>make[2]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples/animation'</p><p>make[1]: *** [sub-animation-make_default] 错误 2</p><p>make[1]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples'</p><p>make: *** [sub-examples-make_default-ordered] 错误 2</p><p>解决：</p><p><strong>修改mkspecs/qws/linux-arm-g++/qmake.conf</strong></p><p>QMAKE_LINK = arm-linux-g++ -lts</p><p>QMAKE_LINK_SHLIB = arm-linux-g++ -lts</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p><p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><p>&nbsp;</p></p><p><font size="4">&nbsp;</font></p></p><p><font size="4">至此，QtEmbedded-4.6.2在arm-linux-gcc 3.4.1下编译完成！</font></p></p><p>&nbsp;</p></p><p><font size="4">最后，make install</font></p></p><p>&nbsp;</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/92.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=92</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=92&amp;key=666cfb2d</trackback:ping></item><item><title>QT中使用动态链接库</title><author>a@b.com (lijian)</author><link>http://www.mculee.cn/post/91.html</link><pubDate>Fri, 04 Jun 2010 09:49:00 +0800</pubDate><guid>http://www.mculee.cn/post/91.html</guid><description><![CDATA[<p>QT中使用.so有两种方式，一种是普通的.so，包含了一些函数，这种暂且不讨论</p><p>另外一种是QT中所谓的Plugin，每一个.so都包含了一个类的实现，这个类可以是一个QObject的派生类，所以，插件可以按照类的形式把某些操作封装。接下来讨论这种用法。</p><p>插件工程的建立：</p><p>第一步，通常在建立Plugin之前，需要首先有一个抽象类，用来描述Plugin的功能。</p><p>通常，抽象类写在一个.h文件中，并且，通常都会包含&lt;QtGUI&gt;，如果不包含，需要使用QObject派生类时会有问题。</p><p>如：</p><p>#include &lt;QtGui&gt;</p><p>#include &lt;QWidget&gt;</p><p>class TestInterface</p><p>{</p><p>public:</p><p>virtual ~TestInterface() {}</p><p>public:</p><p>virtual QString Name() = 0;</p><p>virtual bool doSomeThing() = 0;</p><p>};</p><p>Q_DECLARE_INTERFACE(TestInterface, &quot;com.trolltech.Plugin.TestInterface/1.0&quot;) //这个宏用声明接口</p><p>最后的Q_DECLARE_INTERFACE不能少，否则编译出来的动态链接库不能被QT识别！</p><p>有了抽象类之后，接下来进入第二步，创建动态链接库工程：</p><p><b><img title="clip_image002" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="424" alt="clip_image002" width="598" border="0" src="http://www.mculee.cn/upload/2010/6/201006041738558383.jpg" /></b></p><p>新建工程时选择C++ Library Project，然后进入下一步后，Type选择&ldquo;Shared library&rdquo;，表示创建动态库：</p><p><b><img title="clip_image004" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="395" alt="clip_image004" width="559" border="0" src="http://www.mculee.cn/upload/2010/6/201006041738567822.jpg" /></b></p><p>取好名字后，在下一步中选择需要的组件，通常都会把QtGui选中：</p><p><b><img title="clip_image006" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="395" alt="clip_image006" width="559" border="0" src="http://www.mculee.cn/upload/2010/6/201006041738587418.jpg" /></b></p><p>后面的步骤根据需要进行设置即可。</p><p>第三步，在生成的工程的头文件中，包含之前编写的抽象类头文件，并将向导自动创建的类修改为抽象类的派生类：</p><p>#ifndef PODTEST_H</p><p>#define PODTEST_H</p><p>#include &quot;pod_global.h&quot;</p><p>#include &quot;testInterface.h&quot;</p><p>class PODSHARED_EXPORT PodTest : public TestInterface {</p><p>Q_INTERFACES(TestInterface)</p><p>public:</p><p>PodTest();</p><p>};</p><p>#endif // PODTEST_H</p><p>其中，Q_INTERFACES(TestInterface)是表示该类使用TestInterface接口。</p><p>在派生类的声明中，可以添加需要的虚函数的实现。</p><p>第四步，在.c文件中添加成员函数的实现。另外，在文件的最后，添加一行：</p><p>Q_EXPORT_PLUGIN2(pod, PodTest);</p><p>表示此动态库需要将PodTest类导出。</p><p>其中，pod是工程名，PodTest是需要导出的类名。</p><p>至此，动态库工程创建完毕。</p><p>动态库的使用：</p><p>QPluginLoader可以调用某个.so的插件。</p><p>QPluginLoader loader(&quot;libtest.so&quot;);</p><p>PodTest *plugin = qobject_cast&lt;TestInterface*&gt;(loader.instance()); // 获取so中的类的对象</p>]]></description><category>技术原创</category><comments>http://www.mculee.cn/post/91.html#comment</comments><wfw:comment>http://www.mculee.cn/</wfw:comment><wfw:commentRss>http://www.mculee.cn/feed.asp?cmt=91</wfw:commentRss><trackback:ping>http://www.mculee.cn/cmd.asp?act=tb&amp;id=91&amp;key=c96fa031</trackback:ping></item></channel></rss>

