﻿<?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++博客-dodo's blog-随笔分类-C++ GUI Programming with Qt4</title><link>http://www.cppblog.com/getborn/category/7059.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 00:31:23 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 00:31:23 GMT</pubDate><ttl>60</ttl><item><title>C++ GUI Programming with Qt 4: 第一章，Qt概述，锚接</title><link>http://www.cppblog.com/getborn/archive/2008/05/15/49892.html</link><dc:creator>多多</dc:creator><author>多多</author><pubDate>Thu, 15 May 2008 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/getborn/archive/2008/05/15/49892.html</guid><wfw:comment>http://www.cppblog.com/getborn/comments/49892.html</wfw:comment><comments>http://www.cppblog.com/getborn/archive/2008/05/15/49892.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/getborn/comments/commentRss/49892.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/getborn/services/trackbacks/49892.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong style="FONT-SIZE: 14pt">锚接(Make Connection)<br></strong></span><br>第二个例子将会说明如何响应用户操作。程序的界面由一个按钮组成，用户在单击这个按钮之后将会退出该程序。源代码跟上一个例程Hello非常相似，区别在于这回我们用<font face="Courier New">QPushButton代替QLabel作为主器件，并且我们将用一段代码把用户操作（单击鼠标）和响应函数联系起来。<br><br>下面是源代码quit.cpp的内容：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">QApplication</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">QPushButton</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_80_299_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_299_Open_Text.style.display='none'; Codehighlighter1_80_299_Closed_Image.style.display='inline'; Codehighlighter1_80_299_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_80_299_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_299_Closed_Text.style.display='none'; Codehighlighter1_80_299_Open_Image.style.display='inline'; Codehighlighter1_80_299_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_80_299_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_80_299_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QApplication&nbsp;app(argc,&nbsp;argv);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QPushButton&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">button&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;QPushButton(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Quit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp; QObject::connect(button,&nbsp;SIGNAL(clicked()),<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">app,&nbsp;SLOT(quit()));<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;button</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">show();<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;app.exec();<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</font><br>当Qt器件接收到用户操作或状态发生改变时将会发出信号。例如QPushButton在被单击后产生一个clicked()信号。一个信号可以与一个函数（Qt中叫做&#8220;槽&#8221;(slot)）进行锚接，当一个信号产生时，与其锚接的槽也会被自动执行。在该例子中，我们把按钮的clicked()信号与QApplication<font face="Courier New">对象的quit()槽锚接。SIGNAL()和SLOT()是Qt的宏，我们将会在下一章详细介绍。<br><br><span style="FONT-SIZE: 8pt; COLOR: #808080">[*]需要注意的是Qt的信号(signal)跟Unix中的信号含义不同，本书中只讨论Qt的信号。</span><br><br><strong>图1.3，包含一个退出按钮的应用程序</strong><br><img height=53 alt="" src="http://www.cppblog.com/images/cppblog_com/getborn/c1-1.3.png" width=102 border=0><br><br>现在创建工程并编译程序：<br><br><span style="COLOR: #993300">qmake -project<br>qmake quit.cpp<br></span><br>然后编译并运行程序，结果如图1.3。</font> 
<img src ="http://www.cppblog.com/getborn/aggbug/49892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/getborn/" target="_blank">多多</a> 2008-05-15 09:01 <a href="http://www.cppblog.com/getborn/archive/2008/05/15/49892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ GUI Programming with Qt 4: 第一章，Qt概述，第一个Qt程序：Hello Qt</title><link>http://www.cppblog.com/getborn/archive/2008/05/14/49821.html</link><dc:creator>多多</dc:creator><author>多多</author><pubDate>Wed, 14 May 2008 06:56:00 GMT</pubDate><guid>http://www.cppblog.com/getborn/archive/2008/05/14/49821.html</guid><wfw:comment>http://www.cppblog.com/getborn/comments/49821.html</wfw:comment><comments>http://www.cppblog.com/getborn/archive/2008/05/14/49821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/getborn/comments/commentRss/49821.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/getborn/services/trackbacks/49821.html</trackback:ping><description><![CDATA[<p><strong><span style="FONT-SIZE: 18pt">第一章，Qt概述 (第一部分完)</span><br></strong><br><img height=175 alt="" src="http://www.cppblog.com/Files/getborn/c1-11.zip" width=200 border=0><br><br>&#183;<span style="FONT-SIZE: 10pt; COLOR: #3366ff">第一个Qt程序：Hello Qt</span><br>&#183;<span style="FONT-SIZE: 10pt; COLOR: #3366ff">连接信息槽</span><br>&#183;<span style="FONT-SIZE: 10pt; COLOR: #3366ff">布置器件</span><br>&#183;<span style="FONT-SIZE: 10pt; COLOR: #3366ff">使用开发文档</span> <br><br><span style="FONT-SIZE: 14pt"><strong>第一个Qt程序：Hello Qt</strong></span><br><br>让我们从一个非常简单的Qt程序开始。我们将会把它一行一行地拆解，最后我们将会学到如何编译和运行它。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">QApplication</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">QLabel</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img id=Codehighlighter1_75_198_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_198_Open_Text.style.display='none'; Codehighlighter1_75_198_Closed_Image.style.display='inline'; Codehighlighter1_75_198_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_75_198_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_198_Closed_Text.style.display='none'; Codehighlighter1_75_198_Open_Image.style.display='inline'; Codehighlighter1_75_198_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_75_198_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_75_198_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QApplication&nbsp;app(argc,&nbsp;argv);<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;QLabel&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;QLabel(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;Qt!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;label</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">show();<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;app.exec();<br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>第1行和第2行包含了QApplication和QLabel类的定义。每一个Qt类的定义都由一个与其类名相同的头文件包含。<br><br>第5行创建了一个QApplication对象以管理应用程序资源。因为Qt支持命令行，<font face="Courier New">QApplication的构造函数需要argc和argv参数。<br><br>第6行创建了一个显示"Hello Qt!"的QLabel器件(widget)。在Qt和Unix术语当中，器件指的是用户界面上的可视元素，这在Windows下被成为控件(control)和容器(container)。按钮、菜单、滚动条和框架都是器件之一。一个器件还可以包含其他器件，比如一个应用程序的窗口器件通常包含了QMenuBar，<tt>QToolBar</tt>s，<tt>QStatusBar等器件。大多数应用程序使用QMainWindow或<tt>QDialog作为窗口器件，但是在Qt中任何器件都能作为一个窗口，在本例中，应用程序窗口是一个QLabel。<br><br>第7行使创建的Label显示出来。我们一般要对器件进行设置后才会显示他们，所以为了避免闪烁，器件在刚创建时总是隐藏的。<br><br>第8行使Qt应用程序开始运转。从这个函数调用开始，程序会进入所谓的事件循环(event loop)。程序将会静待用户的操作，比如鼠标单击和键盘按键。程序通过执行一个或多个函数来响应用户操作产生的事件(也被称作&#8220;消息&#8221;)。比如用户在单击一个器件后将会产生一个鼠标按和下一个鼠标弹起的事件。从这点上看，GUI程序与通常接收数据、输出数据然后不需要人们干涉就终止的批处理程序完全不同。<br><br>为了简便，我们并没有在main()函数的最后delete掉QLabel对象。这样的内存泄露无伤大雅，并且泄露的内存最后将在程序终止时被操作系统回收。(译者注：我看的Qt例程里面貌似都没删&#8230;&#8230;)<br><br>现在我们来看看如何在自己的机子上编写一个Qt程序。首先，你需要安装Qt 4.1.1(或更新的Qt4版本)，具体的安装细节见附录A(本文略)。<br><br>附：Qt4.4.0&nbsp;下载地址：<a href="http://www.qtcn.org/bbs/read.php?tid=1075"><font color=#000000>http://www.qtcn.org/bbs/read.php?tid=1075</font></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装方式：<a href="http://www.qtcn.org/bbs/read.php?tid=4853"><font color=#000000>http://www.qtcn.org/bbs/read.php?tid=4853</font></a><br><br>我们将源代码保存为<font color=#000000><span style="COLOR: #993300">hello.cpp<br></span><br>在命令行下输入<br><br></font><span style="COLOR: #993300"><font color=#000000>qmake -project<br><br></font><span style="COLOR: #000000">以上创建了平台相关的工程文件。然后输入<br><br><span style="COLOR: #993300"><font color=#000000>qmake hello.pro<br><br></font><span style="COLOR: #000000">以上创建了给指定平台使用的makefile。<br><br>最后输入<span style="COLOR: #993300"><font color=#000000>make<span style="COLOR: #000000">即可编译和链接程序了。要运行程序，在Windows下输入<span style="COLOR: #993300">hello</span>，在Unix下为<span style="COLOR: #993300">./hello</span>，在Mac OS X下为<span style="COLOR: #993300">open hello.app</span>。要关闭该程序则单击窗口标题栏上的关闭按钮。</span></font></span></span></span></span></span></tt></tt></font> <br><br><strong>图1.1，Hello on Qt</strong><br><img height=53 alt="" src="http://www.cppblog.com/Files/getborn/c1-12.zip" width=102 border=0><br><br><span style="FONT-SIZE: 10pt; COLOR: #000000"><a name=ch01fn1><sup><font style="FONT-SIZE: 8pt; COLOR: #808080" color=#000000 size=3>[*]</font></sup></a><span style="FONT-SIZE: 8pt; COLOR: #808080">如果出现包含&lt;QApplication&gt;的错误，说明你使用的Qt是较老的版本，确认你的Qt版本在4.0之后。</span><br><br><span style="FONT-SIZE: 10pt; COLOR: #000000">如果你在使用Windows并且已经安装了Qt开源版和MinGW编译器，你会有一个已经为Qt配置好环境变量的命令行快捷方式。如果使用此命令行，你可以通过上面所说的qmake和make命令正确编译一个Qt程序。生成的可执行文件将会保存在工程所在目录的debug和release目录下，比如<font face="Courier New" size=3><span style="FONT-SIZE: 10pt">C:\qt-book\hello\release\hello.exe。</span><br></font></span><br><span style="FONT-SIZE: 10pt; COLOR: #000000">如果你在使用Visual C++，你要执行nmake而不是make。或者你可以通过以下的命令来创建一个Visual Studio工程文件：<br></span><br><font style="FONT-SIZE: 10pt; COLOR: #993300" color=#000000 size=3>qmake -tp vc hello.pro<br></font><br><span style="FONT-SIZE: 10pt; COLOR: #000000">然后在Visual Studio中编译工程。<br></span><br><span style="FONT-SIZE: 10pt; COLOR: #000000">如果你在使用Mac OS上的XCode，你可以通过以下命令生成一个XCode的工程：<br></span><br><span style="FONT-SIZE: 10pt"><font style="FONT-SIZE: 10pt; COLOR: #993300" size=3>qmake -spec macx-xcode</font><br><br>最后，让我们在进入下一个例子之前轻松一下，将：<br></p>
<pre style="FONT-SIZE: 10pt; COLOR: #993300">QLabel *label = new QLabel("Hello Qt!");</pre>
<pre style="FONT-SIZE: 10pt; COLOR: #993300"><span style="COLOR: #000000">换成：</span></pre>
<pre style="FONT-SIZE: 10pt; COLOR: #993300">QLabel *label = new QLabel("&lt;h2&gt;&lt;i&gt;Hello&lt;/i&gt; "
"&lt;font color=red&gt;Qt!&lt;/font&gt;&lt;/h2&gt;");</pre>
<pre style="FONT-SIZE: 10pt; COLOR: #000000">然后重新编译程序。</pre>
<pre style="FONT-SIZE: 10pt; COLOR: #000000"><font size=3><strong><span style="FONT-SIZE: 10pt">图2.2，一个有着HTML风格的Label</span><br></strong><br><br></font><br><br><br><br><br><br><br><br><strong><img height=58 alt="" src="http://www.cppblog.com/Files/getborn/c1-13.zip" width=134 border=0></strong></pre>
<pre style="FONT-SIZE: 10pt; COLOR: #000000">该例子说明，很容易用一些HTML风格的元素增强Qt的界面。</pre>
<pre style="FONT-SIZE: 10pt; COLOR: #000000">&nbsp;</pre>
</span></span>
<img src ="http://www.cppblog.com/getborn/aggbug/49821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/getborn/" target="_blank">多多</a> 2008-05-14 14:56 <a href="http://www.cppblog.com/getborn/archive/2008/05/14/49821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>