﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Welcome to ErranLi's Blog!-随笔分类-QT</title><link>http://www.cppblog.com/erran/category/14071.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 19 Jun 2010 02:56:26 GMT</lastBuildDate><pubDate>Sat, 19 Jun 2010 02:56:26 GMT</pubDate><ttl>60</ttl><item><title>转：QT的信号与槽机制介绍</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118185.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 10:11:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118185.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118185.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118185.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="31">
				<tbody sizcache="1" sizset="31">
						<tr valign="top">
								<td width="10" height="18">
								</td>
								<td width="100%">
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
										<br />
										<a class="bctl" href="http://www.ibm.com/developerworks/cn/">
												<font color="#999999" size="2">developerWorks 中国</font>
										</a>
										<span class="bct">
												<font color="#cccccc" size="2">  &gt;  </font>
										</span>
										<a class="bctl" href="http://www.ibm.com/developerworks/cn/linux/">
												<font color="#999999" size="2">Linux</font>
										</a>
										<font size="2">
												<font color="#cccccc">
														<span class="bct">  &gt;</span>
														<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
														<br />
												</font>
										</font>
										<h1>QT的信号与槽机制介绍</h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="32">
				<tbody sizcache="2" sizset="33">
						<tr valign="top" sizcache="2" sizset="33">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%" sizcache="2" sizset="33">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0" sizcache="2" sizset="33">
												<tbody sizcache="2" sizset="34">
														<tr sizcache="2" sizset="34">
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td sizcache="2" sizset="34">
																		<table cellspacing="0" cellpadding="0" width="150" border="0" sizcache="2" sizset="34">
																				<tbody sizcache="1" sizset="34">
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="35">
																				<tbody sizcache="2" sizset="36">
																						<tr sizcache="2" sizset="36">
																								<td class="no-padding" width="150" sizcache="2" sizset="36">
																										<table cellspacing="0" cellpadding="0" width="143" border="0" sizcache="2" sizset="36">
																												<script language="JavaScript" type="text/javascript">
																														<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td><td width="122"><p><b><a class="smallplainlink" href="javascript:print()">打印本页</a></b></p></td></tr>');
//-->
																												</script>
																												<tbody sizcache="1" sizset="36">
																														<tr valign="top">
																																<td width="8">
																																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																</td>
																																<td width="16">
																																		<img height="16" alt="将打印机的版面设置成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" />
																																</td>
																																<td width="122">
																																		<p>
																																				<b>
																																						<a class="smallplainlink" href="javascript:print()">打印本页</a>
																																				</b>
																																		</p>
																																</td>
																														</tr>
																														<noscript>
																														</noscript>
																														<form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" sizcache="1" sizset="37">
																																<input type="hidden" value="信号与槽作为QT的核心机制在QT编程中有着广泛的应用，本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。" name="body" />
																																<input type="hidden" value="QT的信号与槽机制介绍" name="subject" />
																																<input type="hidden" value="cn" name="lang" />
																																<script language="JavaScript" type="text/javascript">
																																		<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																																</script>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img height="1" alt="" src="//www.ibm.com/i/c.gif" width="8" />
																																				</td>
																																				<td width="16">
																																						<img height="16" alt="" src="//www.ibm.com/i/c.gif" width="16" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</form>
																												</tbody>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<!-- this content will be automatically generated across all content areas -->
																		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
										<p>级别： 初级</p>
										<p>
												<a href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#author">
														<font color="#996699">唐新华</font>
												</a>(<a href="mailto:xhsmart@263.net?subject=QT的信号与槽机制介绍&amp;cc=xhsmart@263.net"><font color="#5c81a7">xhsmart@263.net</font></a>), 软件工程师<br /></p>
										<p>2001 年 6 月 01 日</p>
										<blockquote>信号与槽作为QT的核心机制在QT编程中有着广泛的应用，本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。</blockquote>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<p>QT是一个跨平台的C++ GUI应用构架，它提供了丰富的窗口部件集，具有面向对象、易于扩展、真正的组件编程等特点，更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上。QT支持下列平台：MS/WINDOWS-95、98、NT和2000；UNIX/X11-Linux、Sun Solaris、HP-UX、Digital Unix、IBM AIX、SGI IRIX；EMBEDDED-支持framebuffer的Linux平台。伴随着KDE的快速发展和普及，QT很可能成为Linux窗口平台上进行软件开发时的GUI首选。</p>
										<p>
												<a name="1">
														<span class="atitle">概述</span>
												</a>
										</p>
										<p>
										</p>
										<p>信号和槽机制是QT的核心机制，要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口，应用于对象之间的通信，它是QT的核心特性，也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制，它独立于标准的C/C++语言，因此要正确的处理信号和槽，必须借助一个称为moc（Meta Object Compiler）的QT工具，该工具是一个C++预处理程序，它为高层次的事件处理自动生成所需要的附加代码。</p>
										<p>在我们所熟知的很多GUI工具包中，窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作，这个回调函数通常是一个指向某个函数的指针。但是，在QT中信号和槽取代了这些凌乱的函数指针，使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数，他们是类型完全安全的，不会像回调函数那样产生core dumps。</p>
										<p>所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时，信号就由该对象发射(emit)出去，这就是对象所要做的全部事情，它不知道另一端是谁在接收这个信号。这就是真正的信息封装，它确保对象被当作一个真正的软件组件来使用。槽用于接收信号，但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且，对象并不了解具体的通信机制。</p>
										<p>你可以将很多信号与单个的槽进行连接，也可以将单个的信号与很多的槽进行连接，甚至于将一个信号与另外一个信号相连接也是可能的，这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之，信号与槽构造了一个强大的部件编程机制。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="38">
												<tbody sizcache="1" sizset="38">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="39">
												<tbody sizcache="2" sizset="40">
														<tr align="right" sizcache="2" sizset="40">
																<td sizcache="2" sizset="40">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="40">
																				<tbody sizcache="1" sizset="40">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="2">
														<span class="atitle">信号</span>
												</a>
										</p>
										<p>
										</p>
										<p>当某个信号对其客户或所有者发生的内部状态发生改变，信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时，与其相关联的槽将被立刻执行，就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI事件循环。只有当所有的槽返回以后发射函数（emit）才返回。 如果存在多个槽与某个信号相关联，那么，当这个信号被发射时，这些槽将会一个接一个地 执行，但是它们执行的顺序将会是随机的、不确定的，我们不能人为地指定哪个先执行、哪 个后执行。</p>
										<p>信号的声明是在头文件中进行的，QT的signals关键字指出进入了信号声明区，随后即可 声明自己的信号。例如，下面定义了三个信号：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="41">
												<tbody sizcache="1" sizset="41">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						signals: 
		void mySignal();
		void mySignal(int x);
		void mySignalParam(int x,int y);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>在上面的定义中，signals是QT的关键字，而非C/C++的。接下来的一行void mySignal() 定义了信号mySignal，这个信号没有携带参数；接下来的一行void mySignal(int x)定义 了重名信号mySignal，但是它携带一个整形参数，这有点类似于C++中的虚函数。从形式上 讲信号的声明与普通的C++函数是一样的，但是信号却没有函数体定义，另外，信号的返回 类型都是void，不要指望能从信号返回什么有用信息。</p>
										<p>信号由moc自动产生，它们不应该在.cpp文件中实现。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="42">
												<tbody sizcache="1" sizset="42">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="43">
												<tbody sizcache="2" sizset="44">
														<tr align="right" sizcache="2" sizset="44">
																<td sizcache="2" sizset="44">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="44">
																				<tbody sizcache="1" sizset="44">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="3">
														<span class="atitle">槽</span>
												</a>
										</p>
										<p>
										</p>
										<p>槽是普通的C++成员函数，可以被正常调用，它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时，这个槽就会被调用。槽可以有参数，但槽的参数不能有缺省值。</p>
										<p>既然槽是普通的成员函数，因此与其它的函数一样，它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样，槽函数也分为三种类型，即public slots、private slots和protected slots。</p>
										<ul>
												<li>public slots：在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用，你可以创建彼此互不了解的对象，将它们的信号与槽进行连接以便信息能够正确的传递。 
</li>
												<li>protected slots：在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽，它们是类实现的一部分，但是其界面接口却面向外部。 
</li>
												<li>private slots：在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。 </li>
										</ul>
										<p>槽也能够声明为虚函数，这也是非常有用的。</p>
										<p>槽的声明也是在头文件中进行的。例如，下面声明了三个槽：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="45">
												<tbody sizcache="1" sizset="45">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						public slots:
		void mySlot();
		void mySlot(int x);
		void mySignalParam(int x,int y);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="46">
												<tbody sizcache="1" sizset="46">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="47">
												<tbody sizcache="2" sizset="48">
														<tr align="right" sizcache="2" sizset="48">
																<td sizcache="2" sizset="48">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="48">
																				<tbody sizcache="1" sizset="48">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="4">
														<span class="atitle">信号与槽的关联</span>
												</a>
										</p>
										<p>
										</p>
										<p>通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联，这样当发射者发射信号时，接收者的槽函数将被调用。该函数的定义如下：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="49">
												<tbody sizcache="1" sizset="49">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">  	 	  			bool QObject::connect ( const QObject * sender, const char * signal, 
		const QObject * receiver, const char * member ) [static]</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL()，当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话，那么在connect调用中接收者参数可以省略。</p>
										<p>例如，下面定义了两个对象：标签对象label和滚动条对象scroll，并将valueChanged()信号与标签对象的setNum()相关联，另外信号还携带了一个整形参数，这样标签总是显示滚动条所处位置的值。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="50">
												<tbody sizcache="1" sizset="50">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						QLabel     *label  = new QLabel;
    QScrollBar *scroll = new QScrollBar;
    QObject::connect( scroll, SIGNAL(valueChanged(int)),
                      label,  SLOT(setNum(int)) );</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>一个信号甚至能够与另一个信号相关联，看下面的例子：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="51">
												<tbody sizcache="1" sizset="51">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class MyWidget : public QWidget
    {
    public:
        MyWidget();
    ...
    signals:
        void aSignal();
    ...
    private:
    ...
        QPushButton *aButton;
    };
    MyWidget::MyWidget()
    {
        aButton = new QPushButton( this );
        connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );
    }</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>在上面的构造函数中，MyWidget创建了一个私有的按钮aButton，按钮的单击事件产生的信号clicked()与另外一个信号aSignal()进行了关联。这样一来，当信号clicked()被发射时，信号aSignal()也接着被发射。当然，你也可以直接将单击事件与某个私有的槽函数相关联，然后在槽中发射aSignal()信号，这样的话似乎有点多余。</p>
										<p>当信号与槽没有必要继续保持关联时，我们可以使用disconnect函数来断开连接。其定义如下：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="52">
												<tbody sizcache="1" sizset="52">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						bool QObject::disconnect ( const QObject * sender, const char * signal, 
		const Object * receiver, const char * member ) [static]</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这个函数断开发射者中的信号与接收者中的槽函数之间的关联。</p>
										<p>有三种情况必须使用disconnect()函数：</p>
										<ul sizcache="2" sizset="53">
												<li sizcache="2" sizset="53">
														<p>断开与某个对象相关联的任何对象。这似乎有点不可理解，事实上，当我们在某个对象中定义了一个或者多个信号，这些信号与另外若干个对象中的槽相关联，如果我们要切断这些关联的话，就可以利用这个方法，非常之简洁。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="53">
																<tbody sizcache="1" sizset="53">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, 0, 0, 0 )
或者
myObject-&gt;disconnect()</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
												<li sizcache="2" sizset="54">
														<p>断开与某个特定信号的任何关联。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="54">
																<tbody sizcache="1" sizset="54">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, SIGNAL(mySignal()), 0, 0 )
或者
myObject-&gt;disconnect( SIGNAL(mySignal()) )</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
												<li sizcache="2" sizset="55">
														<p>断开两个对象之间的关联。</p>
														<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="55">
																<tbody sizcache="1" sizset="55">
																		<tr>
																				<td class="code-outline">
																						<pre class="displaycode">disconnect( myObject, 0, myReceiver, 0 )
或者
myObject-&gt;disconnect(  myReceiver )</pre>
																				</td>
																		</tr>
																</tbody>
														</table>
														<br />
												</li>
										</ul>
										<p>在disconnect函数中0可以用作一个通配符，分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender不能为0，其它三个参数的值可以等于0。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="56">
												<tbody sizcache="1" sizset="56">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="57">
												<tbody sizcache="2" sizset="58">
														<tr align="right" sizcache="2" sizset="58">
																<td sizcache="2" sizset="58">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="58">
																				<tbody sizcache="1" sizset="58">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="5">
														<span class="atitle">元对象工具</span>
												</a>
										</p>
										<p>
										</p>
										<p>元对象编译器moc（meta object compiler）对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码，元对象包含全部信号和槽的名字以及指向这些函数的指针。</p>
										<p>moc读C++源文件，如果发现有Q_OBJECT宏声明的类，它就会生成另外一个C++源文件，这个新生成的文件中包含有该类的元对象代码。例如，假设我们有一个头文件mysignal.h，在这个文件中包含有信号或槽的声明，那么在编译之前 moc 工具就会根据该文件自动生成一个名为mysignal.moc.h的C++源文件并将其提交给编译器；类似地，对应于mysignal.cpp文件moc工具将自动生成一个名为mysignal.moc.cpp文件提交给编译器。</p>
										<p>元对象代码是signal/slot机制所必须的。用moc产生的C++源文件必须与类实现一起进行编译和连接，或者用#include语句将其包含到类的源文件中。moc并不扩展#include或者#define宏定义,它只是简单的跳过所遇到的任何预处理指令。</p>
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="59">
												<tbody sizcache="1" sizset="59">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="60">
												<tbody sizcache="2" sizset="61">
														<tr align="right" sizcache="2" sizset="61">
																<td sizcache="2" sizset="61">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="61">
																				<tbody sizcache="1" sizset="61">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="6">
														<span class="atitle">程序样例</span>
												</a>
										</p>
										<p>
										</p>
										<p>这里给出了一个简单的样例程序，程序中定义了三个信号、三个槽函数，然后将信号与槽进行了关联，每个槽函数只是简单的弹出一个对话框窗口。读者可以用kdevelop生成一个简单的QT应用程序，然后将下面的代码添加到相应的程序中去。</p>
										<p>信号和槽函数的声明一般位于头文件中，同时在类声明的开始位置必须加上Q_OBJECT语句，这条语句是不可缺少的，它将告诉编译器在编译之前必须先应用moc工具进行扩展。关键字signals指出随后开始信号的声明，这里signals用的是复数形式而非单数，siganls没有public、private、protected等属性，这点不同于slots。另外，signals、slots关键字是QT自己定义的，不是C++中的关键字。</p>
										<p>信号的声明类似于函数的声明而非变量的声明，左边要有类型，右边要有括号，如果要向槽中传递参数的话，在括号中指定每个形式参数的类型，当然，形式参数的个数可以多于一个。</p>
										<p>关键字slots指出随后开始槽的声明，这里slots用的也是复数形式。</p>
										<p>槽的声明与普通函数的声明一样，可以携带零或多个形式参数。既然信号的声明类似于普通C++函数的声明，那么，信号也可采用C++中虚函数的形式进行声明，即同名但参数不同。例如，第一次定义的void mySignal()没有带参数，而第二次定义的却带有参数，从这里我们可以看到QT的信号机制是非常灵活的。</p>
										<p>信号与槽之间的联系必须事先用connect函数进行指定。如果要断开二者之间的联系，可以使用函数disconnect。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="62">
												<tbody sizcache="1" sizset="62">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						//tsignal.h
...
class TsignalApp:public QMainWindow
{
	Q_OBJECT
	...
	//信号声明区
	signals: 
		//声明信号mySignal()
		void mySignal();
		//声明信号mySignal(int)
		void mySignal(int x);
		//声明信号mySignalParam(int,int)
		void mySignalParam(int x,int y);
	//槽声明区
	public slots: 
		//声明槽函数mySlot()
		void mySlot();
		//声明槽函数mySlot(int)
		void mySlot(int x);
		//声明槽函数mySignalParam (int，int)
		void mySignalParam(int x,int y);
}
...
//tsignal.cpp
...
TsignalApp::TsignalApp()
{
	...
	//将信号mySignal()与槽mySlot()相关联
	connect(this,SIGNAL(mySignal()),SLOT(mySlot())); 
	//将信号mySignal(int)与槽mySlot(int)相关联
	connect(this,SIGNAL(mySignal(int)),SLOT(mySlot(int))); 
	//将信号mySignalParam(int,int)与槽mySlotParam(int,int)相关联
	connect(this,SIGNAL(mySignalParam(int,int)),SLOT(mySlotParam(int,int))); 
}
// 定义槽函数mySlot()
void TsignalApp::mySlot()
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample without 
parameter.");
}
// 定义槽函数mySlot(int)
void TsignalApp::mySlot(int x)
{
	QMessageBox::about(this,"Tsignal", "This is a signal/slot sample with one 
parameter.");
}
// 定义槽函数mySlotParam(int,int)
void TsignalApp::mySlotParam(int x,int y)
{
	char s[256];
	sprintf(s,"x:%d y:%d",x,y);
	QMessageBox::about(this,"Tsignal", s);
}
void TsignalApp::slotFileNew()
{
	//发射信号mySignal()
	emit mySignal();
	//发射信号mySignal(int)
	emit mySignal(5);
	//发射信号mySignalParam(5，100)
	emit mySignalParam(5,100);
}</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="63">
												<tbody sizcache="1" sizset="63">
														<tr>
																<td>
																		<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																		<br />
																		<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																</td>
														</tr>
												</tbody>
										</table>
										<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizcache="2" sizset="64">
												<tbody sizcache="2" sizset="65">
														<tr align="right" sizcache="2" sizset="65">
																<td sizcache="2" sizset="65">
																		<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																		<br />
																		<table cellspacing="0" cellpadding="0" border="0" sizcache="2" sizset="65">
																				<tbody sizcache="1" sizset="65">
																						<tr>
																								<td valign="center">
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																										<br />
																								</td>
																								<td valign="top" align="right">
																										<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html#main">
																												<b>
																														<font color="#996699">回页首</font>
																												</b>
																										</a>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<p>
												<a name="7">
														<span class="atitle">应注意的问题</span>
												</a>
										</p>
										<p>
										</p>
										<p>信号与槽机制是比较灵活的，但有些局限性我们必须了解，这样在实际的使用过程中做到有的放矢，避免产生一些错误。下面就介绍一下这方面的情况。</p>
										<p>1．信号与槽的效率是非常高的，但是同真正的回调函数比较起来，由于增加了灵活性，因此在速度上还是有所损失，当然这种损失相对来说是比较小的，通过在一台i586-133的机器上测试是10微秒（运行Linux），可见这种机制所提供的简洁性、灵活性还是值得的。但如果我们要追求高效率的话，比如在实时系统中就要尽可能的少用这种机制。</p>
										<p>2．信号与槽机制与普通函数的调用一样，如果使用不当的话，在程序执行时也有可能产生死循环。因此，在定义槽函数时一定要注意避免间接形成无限循环，即在槽中再次发射所接收到的同样信号。例如,在前面给出的例子中如果在mySlot()槽函数中加上语句emit mySignal()即可形成死循环。</p>
										<p>3．如果一个信号与多个槽相联系的话，那么，当这个信号被发射时，与之相关的槽被激活的顺序将是随机的。</p>
										<p>4. 宏定义不能用在signal和slot的参数中。</p>
										<p>既然moc工具不扩展#define，因此，在signals和slots中携带参数的宏就不能正确地工作，如果不带参数是可以的。例如，下面的例子中将带有参数的宏SIGNEDNESS(a)作为信号的参数是不合语法的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="66">
												<tbody sizcache="1" sizset="66">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						#ifdef ultrix
    #define SIGNEDNESS(a) unsigned a
    #else
    #define SIGNEDNESS(a) a
    #endif
    class Whatever : public QObject 
    {
    [...]
    signals:
        void someSignal( SIGNEDNESS(a) );
    [...]
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>5. 构造函数不能用在signals或者slots声明区域内。</p>
										<p>的确，将一个构造函数放在signals或者slots区内有点不可理解，无论如何，不能将它们放在private slots、protected slots或者public slots区内。下面的用法是不合语法要求的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="67">
												<tbody sizcache="1" sizset="67">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class SomeClass : public QObject 
    {
        Q_OBJECT
    public slots:
        SomeClass( QObject *parent, const char *name )
            : QObject( parent, name ) {}  // 在槽声明区内声明构造函数不合语法
    [...]
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>6. 函数指针不能作为信号或槽的参数。</p>
										<p>例如，下面的例子中将void (*applyFunction)(QList*, void*)作为参数是不合语法的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="68">
												<tbody sizcache="1" sizset="68">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    public slots:
        void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>你可以采用下面的方法绕过这个限制：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="69">
												<tbody sizcache="1" sizset="69">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">							typedef void (*ApplyFunctionType)(QList*, void*);
    class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    public slots:
        void apply( ApplyFunctionType, char *);
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>7.信号与槽不能有缺省参数。</p>
										<p>既然signal-&gt;slot绑定是发生在运行时刻，那么，从概念上讲使用缺省参数是困难的。下面的用法是不合理的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="70">
												<tbody sizcache="1" sizset="70">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class SomeClass : public QObject 
    {
        Q_OBJECT
    public slots:
        void someSlot(int x=100); // 将x的缺省值定义成100，在槽函数声明中使用是错误的
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>8.信号与槽也不能携带模板类参数。</p>
										<p>如果将信号、槽声明为模板类参数的话，即使moc工具不报告错误，也不可能得到预期的结果。 例如，下面的例子中当信号发射时，槽函数不会被正确调用：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="71">
												<tbody sizcache="1" sizset="71">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						[...]
   public slots:
       void MyWidget::setLocation (pair&lt;int,int&gt; location);
   [...]
   public signals:
       void MyObject::moved (pair&lt;int,int&gt; location);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>但是，你可以使用typedef语句来绕过这个限制。如下所示：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="72">
												<tbody sizcache="1" sizset="72">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						typedef pair&lt;int,int&gt; IntPair; 
   [...]
   public slots:
       void MyWidget::setLocation (IntPair location);
   [...]
   public signals:
       void MyObject::moved (IntPair location);</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>这样使用的话，你就可以得到正确的结果。</p>
										<p>9.嵌套的类不能位于信号或槽区域内，也不能有信号或者槽。</p>
										<p>例如，下面的例子中，在class B中声明槽b()是不合语法的，在信号区内声明槽b()也是不合语法的。</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="73">
												<tbody sizcache="1" sizset="73">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class A 
    {
        Q_OBJECT
    public:
        class B 
    {
        public slots:   // 在嵌套类中声明槽不合语法
            void b();
        [....]
        };
    signals:
        class B 
    {
        // 在信号区内声明嵌套类不合语法
        void b();
        [....]
        }:
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<p>10.友元声明不能位于信号或者槽声明区内。</p>
										<p>相反，它们应该在普通C++的private、protected或者public区内进行声明。下面的例子是不合语法规范的：</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="74">
												<tbody sizcache="1" sizset="74">
														<tr>
																<td class="code-outline">
																		<pre class="displaycode">						class someClass : public QObject 
    {
        Q_OBJECT
    [...]
    signals: //信号定义区
        friend class ClassTemplate; // 此处定义不合语法
    };</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<br />
										<br />
										<br />
										<p>
												<a name="resources">
														<span class="atitle">参考资料 </span>
												</a>
										</p>
										<ul>
												<li>
														<a href="http://www.trolltech.com/">
																<font color="#5c81a7">QT</font>
														</a>
														<br />
														<br />
												</li>
												<li>
														<a href="http://www.kdevelop.org/">
																<font color="#5c81a7">KDevelop</font>
														</a>
														<br />
												</li>
										</ul>
										<br />
										<br />
										<p>
												<a name="author">
														<span class="atitle">关于作者</span>
												</a>
										</p>
										<table cellspacing="0" cellpadding="0" width="100%" border="0" sizcache="2" sizset="75">
												<tbody sizcache="1" sizset="75">
														<tr>
																<td colspan="3">
																		<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
																</td>
														</tr>
														<tr valign="top" align="left">
																<td>
																		<p>
																		</p>
																</td>
																<td>
																		<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
																</td>
																<td width="100%">
																		<p>唐新华 软件工程师。Email: <a href="mailto:xhsmart@263.net?cc=xhsmart@263.net"><font color="#5c81a7">xhsmart@263.net</font></a></p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/erran/aggbug/118185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 18:11 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:VC2008 express编译QT4.5</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118146.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118146.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118146.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118146.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118146.html</trackback:ping><description><![CDATA[
		<div class="tit">VC2008 express编译QT4.5（转帖）</div>
		<div class="date">2009-11-26 15:35</div>
		<table style="TABLE-LAYOUT: fixed; WIDTH: 100%">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">
												<p>原文：<a href="http://hi.baidu.com/fairysky/blog/item/883cd1b474c33c7b8bd4b219.html">http://hi.baidu.com/fairysky/blog/item/883cd1b474c33c7b8bd4b219.html</a></p>
												<p>
												</p>
												<p>最新的QT4.5发布了，增加了LGPL2.1协议，实在是众望所归啊。。。</p>
												<p>参考资料：</p>
												<p>1、 <a href="http://blog.5d.cn/user43/JjYyBb/200810/502508.html" target="_blank">【转贴】VC 2005 下如何编译安装并开发 QT 4.4.0 应用程序 </a></p>
												<p>2、 <a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913671.aspx" target="_blank">qt4:qt编译安装信息的解读</a></p>
												<p>3、 <a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913431.aspx" target="_blank">qt4:windows下编译qt 4.3.2</a></p>
												<p>4、 <a href="http://www.cevx.com/bbs/viewthread.php?tid=16036" target="_blank">网友已编译好的Qt开源版下载(含Debug库)</a> （主要是参考它的configure参数）</p>
												<p>还有QT安装目录下的“ install ”文件</p>
												<p>
												</p>
												<p>
														<font color="#993366" size="4">
																<strong>一、下载QT4.5（本文仅讨论LGPL/Free Downloads）</strong>
														</font>
												</p>
												<p>下载地址：<a href="http://download.qtsoftware.com/qt/source/qt-win-opensource-src-4.5.0.zip">http://download.qtsoftware.com/qt/source/qt-win-opensource-src-4.5.0.zip</a></p>
												<p>解压，假定解压到E:\qt-win-opensource-src-4.5.0 （解压路径不要包含空白，另外也建议不要包含中文名称），解压后目录层次：</p>
												<div align="center" forimg="1">
														<a href="http://hiphotos.baidu.com/fairysky/pic/item/883cd1b457471d528ad4b276.jpg" target="_blank">
																<div forimg="1">
																		<img class="blogimg" height="383" src="http://hiphotos.baidu.com/fairysky/pic/item/883cd1b457471d528ad4b276.jpg" width="260" border="0" small="0" />
																</div>
														</a>
												</div>
												<p>
														<font color="#993366" size="4">
																<strong>二、设置环境变量</strong>
														</font>
												</p>
												<p>set QTDIR=E:\qt-win-opensource-src-4.5.0</p>
												<p>set path=%path%;%QTDIR%\bin</p>
												<p>
														<font color="#993366">
																<strong>方法：</strong>
														</font>
												</p>
												<p>“我的电脑”-&gt;“属性”-&gt;“高级”-&gt;“环境变量”，弹出一个对话框，</p>
												<p>然后“xxx的用户变量”-&gt;“新建”，弹出一个输入对话框，输入：</p>
												<p>“变量名” --- QTDIR</p>
												<p>“变量值” --- E:\qt-win-opensource-src-4.5.0</p>
												<div align="center" forimg="1">
														<img class="blogimg" src="http://hiphotos.baidu.com/fairysky/pic/item/3ccdad1e55bc0b3f413417b3.jpg" border="0" small="0" />
												</div>
												<p>
														<font color="#993366">
																<strong>同上，修改path环境变量方法：</strong>
														</font>
												</p>
												<p>
														<font color="#000000">在“xxx的用户变量”中选择“PATH”，然后“编辑”，在“变量值”的最后输入“ ;%QTDIR%\bin ”（不带引号，注意有一个分号）</font>
												</p>
												<p align="center" forimg="1">
														<img class="blogimg" src="http://hiphotos.baidu.com/fairysky/pic/item/2b8cdac8a2fc3f377f3e6f85.jpg" border="0" small="0" />
												</p>
												<p align="left" forimg="1">
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>三、编译QT</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">1、在命令行设置好vc编译器环境变量（我是通过一个简单的批处理文件来设置好vc编译器的环境变量）</font>
												</p>
												<div style="CLEAR: both">
												</div>
												<div style="BACKGROUND-COLOR: #f9f7ed">
														<div style="BACKGROUND: #fdfdfd">
																<u>Batchfile语言</u>: <a href="http://www.fayaa.com/code/view//">vc编译器环境变量设置.bat</a></div>
														<div class="source" style="BACKGROUND-COLOR: #f9f7ed" jquery1236405784593="2">
																<span style="COLOR: #008000">1 </span>@<span style="COLOR: #0000ff">echo</span><span style="COLOR: #0000ff">off</span><br /><span style="COLOR: #008000">2 </span><span style="COLOR: #0000ff">call</span><span style="COLOR: #a31515">"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"</span> x86<br /><span style="COLOR: #008000">3 </span><br /><span style="COLOR: #008000">4 </span><span style="COLOR: #008000">rem 在这里，调用sqlite3的环境变量设置批处理是因为在后来qt编译时要用到sqlite，qt需要知道sqlite的include和lib以及dll的位置</span><br /><span style="COLOR: #f810b0">5 </span><span style="COLOR: #0000ff">call</span><span style="COLOR: #a31515">"D:\环境变量批处理设置\sqlite3环境变量.bat"</span></div>
												</div>
												<p align="left" forimg="1">过程我就不多说了（如果有不明白的，可以留言；我个人认为尽管在windows下有VS IDE，但是作为一个编程人员，掌握基本的命令行编译知识应该是一个基本的技能）</p>
												<p align="left" forimg="1">如果设置好了vc编译器环境变量，运行" cl/? " （不包括引号），如果输出了cl.exe帮助说明信息，则表示vc编译器环境变量设置成功。</p>
												<p align="left" forimg="1">可以通过" set path "，" set include "，" set lib " 命令查看path、include、lib环境变量</p>
												<p align="left" forimg="1">
														<font color="#993366">2、配置QT（configure</font>）</p>
												<p align="left" forimg="1">在命令行设置好vc编译器环境变量之后，进入到QT解压目录（%QTDIR%），然后输入" configure/? "（configure位于%QTDIR%目录下），查看configure的帮助。</p>
												<p align="left" forimg="1">
														<font color="#993366">下面是我的configure配置参数：</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">1、编译shared版（默认编译为shared版，不需要设置），并且编译debug和release两个版本（<font color="#3366ff">-debug-release</font>）<br />2、使用vc2008（包括express版）(<font color="#3366ff">-platform win32-msvc2008</font>)<br />3、使用qt自带的zlib、gif、libpng、libmng、libtiff、libjpeg (</font>
														<font color="#3366ff">-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg</font>
														<font color="#993366">)<br />4、编译数据库插件支持sqlite、odbc（需要相应的C/C++头文件和库的支持）(</font>
														<font color="#3366ff">-plugin-sql-sqlite -plugin-sql-odbc</font>
														<font color="#993366">)<br />5、不支持qt3 (<font color="#3366ff">-no-qt3support</font>)</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">其中第4条，我们已经在</font>
														<a href="http://www.fayaa.com/code/view//">
																<font color="#ff0000">vc编译器环境变量设置.bat</font>
														</a>
														<font color="#ff0000">进行了设置，通过</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">
																<span style="COLOR: #0000ff">call</span>
																<span style="COLOR: #a31515">"D:\环境变量批处理设置\sqlite3环境变量.bat"</span>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#ff0000">设置了sqlite的include和lib以及dll的搜索路径（dll搜索路径设置在path环境变量中）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">附加<br />6、无mmx指令集支持 (<font color="#3366ff">-no-mmx</font>)<br />7、无3dnow指令集支持 (<font color="#3366ff">-no-3dnow</font>)<br />8、无sse和sse2指令集支持 (<font color="#3366ff">-no-sse -no-sse2</font>)<br />9、无direct3d支持（我用不上direct3d，默认不编译direct3d）<br />10、无openssl支持 (<font color="#3366ff">-no-openssl</font>)<br />11、无dbus支持（dbus是一个类似于IPC的实现，不过我好像用不上） (<font color="#3366ff">-no-dbus</font>)<br />12、无phonon支持以及phonon向后兼容性支持（phonon是一个基于kde的多媒体支持，</font>
														<font color="#993366">并且主要是用于那些比较古老的编译器，在我的机器上不需要） （<font color="#3366ff">-no-phonon -no-phonon-backend</font>）<br />13、不编译webkit模块（类似于浏览器的东西，我个人不需要） （<font color="#3366ff">-no-webkit</font>）<br />14、不支持脚本工具scripttools （<font color="#3366ff">-no-scripttools</font>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">生成工程文件相关<br />15、无生成sln以及vcproj文件（生成的sln文件好像不好使，不能用vc2008打开），只生成makefile文件 （<font color="#3366ff">-no-dsp -no-vcproj</font>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">上述只是我个人的需求，大家可以根据自己的需要进行调整（我这么做只是为了尽可能的缩短编译时间）</font>
												</p>
												<p align="left" forimg="1">
														<strong>
																<font color="#993366">configure -debug-and-release -platform win32-msvc2008 -qt-zlib -qt-gif -qt</font>
														</strong>
														<strong>
																<font color="#993366">-libpng -qt-libmng -qt-libtiff -qt-libjpeg -plugin-sql-sqlite -plugin-sql-</font>
														</strong>
														<strong>
																<font color="#993366">odbc -no-qt3support -no-mmx -no-3dnow -no-sse -no-sse2 -no-openssl -no-dbus </font>
														</strong>
														<strong>
																<font color="#993366">-no-phonon -no-phonon-backend -no-webkit -no-scripttools -no-dsp -no-vcproj</font>
														</strong>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">configure大概需要执行5~10分钟，如果对configure产生的信息不清楚的话，可以看看这篇文章（<a href="http://blog.csdn.net/lhfeng/archive/2007/12/03/1913671.aspx" target="_blank">qt4:qt编译安装信息的解读</a>）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">configure.exe主要是做两件事：</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">1）编译qmake，并将编译好的qmake.exe拷贝到bin目录下（这又是之前要添加" %QTDIR%\bin ”到path环境变量中的原因）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">2）生成makefile文件（包括编译qt的makefile文件以及examples、demos、tools等的makefiles文件）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>三、编译QT</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">在QT的解压目录下执行nmake（确保configure.exe运行成功，configure会在QT的解压目录下生成一个Makefile文件）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">为了缩短编译时间，我们可以现将examples和demos目录转移（例如新建一个文件夹，然后将这2个目录移到该目录下），这样nmake在编译到examples和demos时会报错，然后退出编译过程</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">然后就是漫长的等待了~~~（编译的时候就去干点别的吧，运动运动<img src="http://img.baidu.com/hi/jx/j_0028.gif" />）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">
																<u>
																		<font color="#0000ff">按照我上面的操作，编译完成qt大概需要1个小时；占用硬盘2G左右；如果完整的编译qt、examples、demos），那么大概需要4~6个小时，占用硬盘10G左右</font>
																</u>
																<img src="http://img.baidu.com/hi/jx/j_0016.gif" />）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>四、清理收尾工作</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">编译完成之后，要进行清理，不然那么多硬盘被占用了，太心疼了</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">运行" nmake confclean "（参见" install "文件），这样清理完成之后，整个qt解压目录大小约为770M左右</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366" size="4">
																<strong>五、编译demos</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">将examples、demos目录移回原位，如果想要运行demos，可以通过命令行进入到demos目录下（保证环境变量已设置好），然后运行nmake（又是一段漫长的时间，1个小时左右）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">编译demos完成之后，在qt解压目录下的bin目录中有一个" qtdemo.exe "，运行</font>
												</p>
												<p align="left" forimg="1">
														<font color="#000000">同样地，我们也要进行清理工作，进入到demos目录（同上，要保证环境变量已设置好），运行" nmake clean "</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">这样我们就能看到一部分的运行示例了（为什么是部分？因为qtdemo.exe不仅仅是包含demos目录中的例子，同样也包含examples目录中的例子，如果想要查看完整的qtdemo.exe，还需要编译examples，方法同demos）</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>最后，将Qt路径添加到VC编译环境中。（参见</strong>
																<a href="http://blog.5d.cn/user43/JjYyBb/200810/502508.html" target="_blank">【转贴】VC 2005 下如何编译安装并开发 QT 4.4.0 应用程序 </a>
																<strong>）</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>工具-&gt;选项-&gt;项目和解决方案-&gt;VC++目录，</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>在包含文件一栏添加： E:\qt-win-opensource-src-4.5.0\include\QtGui；E:\qt-win-opensource-src-4.5.0\include\QtCore；E:\qt-win-opensource-src-4.5.0\include</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>在库文件一栏添加E:\qt-win-opensource-src-4.5.0\lib</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<strong>将QT安装路径添加到Path系统环境变量中，例如：E:\qt-win-opensource-src-4.5.0\bin（这一步可以省略，在本文的“ <font size="4">二、设置环境变量</font> ”已经设置好了）</strong>
														</font>
												</p>
												<p align="left" forimg="1">
														<font color="#993366">
																<font size="5">
																		<strong>至此，QT和vc编译环境基本上配置完成了<img src="http://img.baidu.com/hi/ldw/w_0014.gif" /></strong>
																</font>
														</font>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/erran/aggbug/118146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 10:18 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Qt-WinCE安装、开发及部署全解</title><link>http://www.cppblog.com/erran/archive/2010/06/18/118145.html</link><dc:creator>erran</dc:creator><author>erran</author><pubDate>Fri, 18 Jun 2010 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/erran/archive/2010/06/18/118145.html</guid><wfw:comment>http://www.cppblog.com/erran/comments/118145.html</wfw:comment><comments>http://www.cppblog.com/erran/archive/2010/06/18/118145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/erran/comments/commentRss/118145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/erran/services/trackbacks/118145.html</trackback:ping><description><![CDATA[
		<h1 id="subject_tpc">Qt-WinCE安装、开发及部署全解</h1>
		<div class="c">
		</div>
		<div id="mag_tpc">
				<blockquote class="blockquote block-img">
						<span class="s3">
								<b class="fl black">
										<a href="http://www.qtcn.org/bbs/u.php?action=show&amp;uid=41447" target="_blank">penguinx</a>
								</b>  发表于: 2008-07-31<br /><br />管理提醒: </span>本帖被 XChinux 从 Qt for Embedded Linux 移动到本区(2010-02-07) </blockquote>
		</div>
		<div class="tpc_content">
				<div class="c" id="p_tpc">
				</div>
				<div class="f14" id="read_tpc">
						<div align="center">
								<font face="新宋体 ">Qt-WinCE</font>
								<font face="新宋体 ">全解<br /></font>
						</div>
						<font face="新宋体 ">声明：</font>
						<font face="新宋体 ">花费了三天时间，周转各大网站，终于在今天将自己的第一个</font>
						<font face="新宋体 ">
								<font face="times ">Qt</font>
						</font>
						<font face="新宋体 ">程序在“小</font>
						<font face="新宋体 ">
								<font face="times ">I(SAMSUNG i718+)</font>
						</font>
						<font face="新宋体 ">”上跑了起来！<br /></font>
						<br />
						<font face="新宋体 ">
								<br />
						</font>
						<br />
						<div align="center">
								<font face="新宋体 ">一、</font>
								<font face="新宋体 ">
										<font face="times ">Qt</font>
								</font>
								<font face="新宋体 ">
								</font>
								<font face="新宋体 ">嵌入式环境的搭建<br /></font>
						</div>
						<font face="times ">
								<font face="times ">a)        </font>
						</font>
						<font face="新宋体 ">首先，下载</font>
						<font face="新宋体 ">
								<font face="times ">Qt</font>
						</font>
						<font face="新宋体 ">的嵌入式开发包</font>
						<font face="times ">
								<font face="新宋体 ">qt-embedded-wince-opensource-src-4.4.0.zip</font>
								<br />
						</font>
						<br />
						<font face="times ">
								<font face="times ">b)        </font>
						</font>
						<font face="宋体 ">然后，下载</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">。</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">c)        </font>
						</font>
						<font face="宋体 ">最后，下载一个嵌入式开发的</font>
						<font face="times ">SDK</font>
						<font face="宋体 ">，如</font>
						<font face="times ">Windows Mobile 5.0 Pocket PC SDK,</font>
						<font face="宋体 ">可以在微软的官方网站上下载到！</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">d)        </font>
						</font>
						<font face="宋体 ">还有一个是同步的软件</font>
						<font face="times ">Microsoft ActiveSync4.5</font>
						<font face="宋体 ">中文简体版。</font>
						<br />
						<br />
						<font face="times ">------------------------------------------</font>
						<font face="宋体 ">安</font>
						<font face="times ">----</font>
						<font face="宋体 ">装</font>
						<font face="times ">----------------------------------</font>
						<br />
						<font face="times ">
								<font face="times ">e)        </font>
						</font>
						<font face="宋体 ">首先安装</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">，很简单，按照向导来，在自定义安装中务必选择“智能设备开发”。</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">f)          </font>
						</font>
						<font face="宋体 ">关于</font>
						<font face="times ">Microsoft ActiveSync4.5</font>
						<font face="宋体 ">的安装更是“</font>
						<font face="times ">straightforward</font>
						<font face="宋体 ">”。在此不再多说！</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">g)        </font>
						</font>
						<font face="宋体 ">然后，安装</font>
						<font face="times ">Windows Mobile</font>
						<font face="宋体 ">或是其它版本的</font>
						<font face="times ">SDK</font>
						<font face="宋体 ">，可以用自定义的</font>
						<font face="times ">SDK!</font>
						<font face="宋体 ">简单</font>
						<br />
						<br />
						<font face="times ">
								<font face="times ">h)        </font>
						</font>
						<font face="宋体 ">比较麻烦的就是</font>
						<font face="新宋体 ">
								<font face="times ">qt-embedded-wince</font>
						</font>
						<font face="新宋体 ">的安装。参照下面的步骤：①、解压，将解压后的文件夹放到一个不含空格的路径中，如我的：</font>
						<font face="times ">f:\penguinx\qt_wince</font>
						<font face="宋体 ">，</font>
						<font face="times ">qt_wince</font>
						<font face="宋体 ">即为此文件夹。然后设置环境变量：右键“我的电脑”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“属性”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">点“高级”标签－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“环境变量”选项－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">在</font>
						<font face="times ">"PATH"</font>
						<font face="宋体 ">中添加路径“</font>
						<font face="times ">f:\penguinx\qt_wince \ bin</font>
						<font face="宋体 ">”。</font>
						<font face="times ">OK</font>
						<font face="宋体 ">！②编译前戏。首先，配置编译选项，进行</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">的命令行中，进入解压的文件夹，然后执行如下：</font>
						<font face="times ">configure -platform win32-msvc2005 -xplatform wince50standard-armv4i-msvc2005</font>
						<font face="宋体 ">可以根据自己的板子及手机配置来选择其它的嵌入式的</font>
						<font face="times ">xplatfrom</font>
						<font face="宋体 ">。这个过程可能需要十几分钟。执行完后，再次在</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">中设置临时的环境变量，编译时要用到：如下：</font>
						<br />
						<br />
						<font face="times ">      set INCLUDE=D:\Program Files\Microsoft Visual Studio 8\VC\ce\include;D:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Include\Armv4i<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
						<font face="times ">      set LIB=D:\Program Files\Microsoft Visual Studio 8\VC\ce\lib\armv4i;D:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Lib\ARMV4I<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
						<font face="times ">      set PATH=D:\Program Files\Microsoft Visual Studio 8\VC\ce\bin\x86_arm;%PATH%<br /></font>
						<br />
						<div align="left">
								<font face="times ">              </font>
								<font face="宋体 ">在此我期望能根据自己的软件安装情况将上面的目录“拿来主义”一下。设</font>
								<font face="times ">
								</font>
								<font face="宋体 ">置完后，执行</font>
								<font face="times ">nmake</font>
								<font face="宋体 ">，过两、三个钟头后，你就可以</font>
								<font face="times ">Enjoy your journey. <br /></font>
						</div>
						<font face="新宋体 ">最后，执行nmake，安装完毕！我的Qt-WinCE安装在　</font>
						<font face="times ">f:\penguinx\qt_wince<br /></font>
						<br />
						<font face="新宋体 ">
								<br />
						</font>
						<br />
						<div align="center">
								<font face="新宋体 ">二、编译Qt-WinCE程序<br /></font>
						</div>
						<font face="宋体 ">命令行法</font>
						<font face="times ">(</font>
						<font face="宋体 ">不用</font>
						<font face="times ">IDE)</font>
						<font face="宋体 ">：</font>
						<br />
						<br />
						<font face="宋体 ">首先、用</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行进入要编译的程序目录</font>
						<font face="times ">(</font>
						<font face="宋体 ">此目录最好就在安装目录</font>
						<font face="times ">f:\penguinx\qt_wince</font>
						<font face="宋体 ">下</font>
						<font face="times ">)</font>
						<font face="宋体 ">，执行</font>
						<font face="times ">&lt;<font size="3"> f:\penguinx\qt_wince</font> &gt;bin\qmake.exe –project –o example.pro  </font>
						<font face="宋体 ">其中，</font>
						<font face="times ">Install Qt Path</font>
						<font face="宋体 ">为你的</font>
						<font face="times ">Qt-WinCE</font>
						<font face="宋体 ">的安装目录。这个时候，可以产生</font>
						<font face="times ">example.pro</font>
						<font face="宋体 ">文件。</font>
						<br />
						<br />
						<font face="宋体 ">然后、就是产生</font>
						<font face="times ">Makefile</font>
						<font face="宋体 ">的时候：在</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行下输入：</font>
						<br />
						<br />
						<font face="times ">f:\penguinx\qt_wince\bin\qmake -spec ..\mkspecs\wince50standard-armv4i-msvc2005 -win32 -o Makefile example.pro </font>
						<font face="宋体 ">此时，恭喜你，</font>
						<font face="times ">Makefile</font>
						<font face="宋体 ">文件已经产生。</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">最后，就是用</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">来编译和链接程序了。先将安装时的环境变量</font>
						<font face="times ">(</font>
						<font face="宋体 ">三个</font>
						<font face="times ">set)</font>
						<font face="宋体 ">在当前</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行下重新执行一遍。否则会出现如下错误：</font>
						<br />
						<br />
						<font face="times ">cl: </font>
						<font face="宋体 ">命令行</font>
						<font face="times ">warning D9002 :</font>
						<font face="宋体 ">忽略未知选项“</font>
						<font face="times ">-QRarch4T</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">cl: </font>
						<font face="宋体 ">命令行</font>
						<font face="times ">warning D9002 :</font>
						<font face="宋体 ">忽略未知选项“</font>
						<font face="times ">-QRinterwork-return</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">main.cpp<br /></font>
						<br />
						<font face="times ">mainwindow.cpp<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C2<br /></font>
						<br />
						<font face="times ">146: </font>
						<font face="宋体 ">语法错误</font>
						<font face="times ">: </font>
						<font face="宋体 ">缺少“</font>
						<font face="times ">;</font>
						<font face="宋体 ">”</font>
						<font face="times ">(</font>
						<font face="宋体 ">在标识符“</font>
						<font face="times ">wceMenu</font>
						<font face="宋体 ">”的前面</font>
						<font face="times ">)<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C4<br /></font>
						<br />
						<font face="times ">430: </font>
						<font face="宋体 ">缺少类型说明符</font>
						<font face="times ">- </font>
						<font face="宋体 ">假定为</font>
						<font face="times ">int</font>
						<font face="宋体 ">。注意</font>
						<font face="times ">: C++ </font>
						<font face="宋体 ">不支持默认</font>
						<font face="times ">int<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : error C4<br /></font>
						<br />
						<font face="times ">430: </font>
						<font face="宋体 ">缺少类型说明符</font>
						<font face="times ">- </font>
						<font face="宋体 ">假定为</font>
						<font face="times ">int</font>
						<font face="宋体 ">。注意</font>
						<font face="times ">: C++ </font>
						<font face="宋体 ">不支持默认</font>
						<font face="times ">int<br /></font>
						<br />
						<font face="times ">f:\penguinx\qt_wince\include\qtgui\../../src/gui/widgets/qmenu.h(144) : warning<br /></font>
						<br />
						<font face="times ">C4183: </font>
						<font face="宋体 ">“</font>
						<font face="times ">wceMenu</font>
						<font face="宋体 ">”</font>
						<font face="times ">: </font>
						<font face="宋体 ">缺少返回类型；假定为返回“</font>
						<font face="times ">int</font>
						<font face="宋体 ">”的成员函数。</font>
						<br />
						<br />
						<font face="宋体 ">然后，执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">，看着一行的白银流失完后，就是金子</font>
						<font face="times ">(</font>
						<font face="宋体 ">你的</font>
						<font face="times ">exe</font>
						<font face="宋体 ">文件</font>
						<font face="times ">)</font>
						<font face="宋体 ">了。</font>
						<br />
						<br />
						<font face="宋体 ">注意：在执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">的时候，可能会看到如下错误信息：</font>
						<br />
						<br />
						<font face="times ">        link /LIBPATH:"f:\penguinx\qt_wince\lib" /LIBPATH:"f:\penguinx\qt_wince\<br /></font>
						<br />
						<font face="times ">lib" /NOLOGO /NODEFAULTLIB:OLDNAMES.LIB /DEBUG /SUBSYSTEM:WINDOWSCE,5.00 /MACHIN<br /></font>
						<br />
						<font face="times ">E:THUMB /OUT:debug\node.exe @C:\DOCUME~1\User\LOCALS~1\Temp\nm6B3.tmp<br /></font>
						<br />
						<font face="times ">tmp\obj\debug_shared\main.obj : fatal error LNK1112: </font>
						<font face="宋体 ">模块计算机类型“</font>
						<font face="times ">X</font>
						<font face="times ">86</font>
						<font face="宋体 ">”</font>
						<font face="宋体 ">与目标</font>
						<br />
						<br />
						<font face="宋体 ">计算机类型“</font>
						<font face="times ">THUMB</font>
						<font face="宋体 ">”冲突</font>
						<br />
						<br />
						<font face="times ">NMAKE : fatal error U1077: “"D:\Program Files\Microsoft Visual Studio 8\VC\ce\b<br /></font>
						<br />
						<font face="times ">in\x86_arm\link.EXE"</font>
						<font face="宋体 ">”</font>
						<font face="times ">: </font>
						<font face="宋体 ">返回代码“</font>
						<font face="times ">0x</font>
						<font face="times ">458</font>
						<font face="宋体 ">”</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">这种错误搞的我很无奈，我不执行</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">，直接执行</font>
						<font face="times ">nmake release</font>
						<font face="宋体 ">就没有这种错误？这种错误可能是因为“环境变量”中“</font>
						<font face="times ">PATH</font>
						<font face="宋体 ">”中设置了“</font>
						<font face="times ">f:\penguinx\qt_wince\bin</font>
						<font face="宋体 ">”。在我把这个变量去掉后，重新打开</font>
						<font face="times ">VS2005</font>
						<font face="宋体 ">命令行</font>
						<font face="times ">(</font>
						<font face="宋体 ">因为得重新读取</font>
						<font face="times ">PATH</font>
						<font face="宋体 ">变量</font>
						<font face="times ">)</font>
						<font face="宋体 ">。然后按照上面的步骤做下来，最后用</font>
						<font face="times ">nmake</font>
						<font face="宋体 ">重新执行一遍，很好很流畅！</font>
						<br />
						<br />
						<div align="center">
								<font face="宋体 ">三、</font>
								<font face="times ">Qt –WinCE</font>
								<font face="宋体 ">程序的部署（非打包）</font>
								<font face="新宋体 ">
										<br />
								</font>
						</div>
						<font size="3">
								<font face="times ">      </font>
								<font face="宋体 ">可以直接把上面开发的</font>
						</font>
						<font face="times ">*.exe</font>
						<font face="宋体 ">文件和其需要的</font>
						<font face="times ">*.dll</font>
						<font face="宋体 ">一起</font>
						<font face="times ">CP</font>
						<font face="宋体 ">到一个目录中，这些</font>
						<font face="times ">dll</font>
						<font face="宋体 ">一般有：</font>
						<br />
						<br />
						<font face="times ">D:\Program Files\Microsoft Visual Studio 8\VC\ce\Dll\armv4i\ msvcr80.dll<br /></font>
						<br />
						<font face="times ">F:\penguinx\wince_vs2005\lib\ QtCore4.dll<br /></font>
						<br />
						<font face="times ">F:\penguinx\wince_vs2005\lib\QtGui4.dll<br /></font>
						<br />
						<font face="宋体 ">其它的根据自己项目的需要</font>
						<font face="times ">CP</font>
						<font face="宋体 ">下，就行了。</font>
						<br />
						<br />
						<font face="times ">      </font>
						<font face="宋体 ">如果想将程序部署成</font>
						<font face="times ">*.cab</font>
						<font face="宋体 ">形式的，在上面的“解决方案”中，点“文件”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“新建”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">“项目”－</font>
						<font face="times ">&gt;</font>
						<font face="宋体 ">点“其它”，其中有关于智能设备部署的，就它了</font>
						<font face="times ">(</font>
						<font face="宋体 ">我在实验室机子上开发的，回来写手记，所以具体的操作记的不是非常清楚，将就！</font>
						<font face="times ">)</font>
						<font face="宋体 ">。根据向导建立后，在新建的</font>
						<font face="times ">cab</font>
						<font face="宋体 ">项目中点“属性”，最后，生成就行了。</font>
						<font face="times ">CP</font>
						<font face="宋体 ">到板子就可以运行了。</font>
						<br />
						<br />
						<font face="宋体 ">注意：所有的</font>
						<font face="times ">CP</font>
						<font face="宋体 ">都是用</font>
						<font face="times ">ActiveSync</font>
						<font face="宋体 ">软件通过</font>
						<font face="times ">USB</font>
						<font face="宋体 ">传输的，当然可以用其它传输手段，最终能上板子就行。</font>
						<br />
						<br />
						<font face="times ">-Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189<br /></font>
						<br />
						<font face="宋体 ">注意在</font>
						<font face="times ">WinCE</font>
						<font face="宋体 ">部署时的版本，如果设备上的</font>
						<font face="times ">WinCE</font>
						<font face="宋体 ">版本比开发用的版本低的话，将显示“</font>
						<font face="times ">****, </font>
						<font face="宋体 ">需要更新的</font>
						<font face="times ">Windows</font>
						<font face="宋体 ">版本”云云。</font>
						<br />
						<br />
						<font face="times ">/SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB<br /></font>
						<br />
						<font face="times ">/SUBSYSTEM:WINDOWSCE,5.00 /MACHINE:THUMB<br /></font>
						<br />
						<font face="times ">
						</font>
						<br />
						<br />
				</div>
		</div>
<img src ="http://www.cppblog.com/erran/aggbug/118145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/erran/" target="_blank">erran</a> 2010-06-18 10:16 <a href="http://www.cppblog.com/erran/archive/2010/06/18/118145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>