📄 qt教程一 —— 第九章:你可以使用加农炮了.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0061)http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-09.html -->
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/tutorial.doc:1153 --><HTML><HEAD><TITLE>Qt教程一 —— 第九章:你可以使用加农炮了</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=Cavendish name=Translator>
<META content=http://www.qiliang.net/qt name="Qt zh_CN Documents Website">
<STYLE type=text/css>H3.fn {
MARGIN-LEFT: 1cm; TEXT-INDENT: -1cm
}
SPAN.fn {
MARGIN-LEFT: 1cm; TEXT-INDENT: -1cm
}
A:link {
COLOR: #004faf; TEXT-DECORATION: none
}
A:visited {
COLOR: #672967; TEXT-DECORATION: none
}
BODY {
BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: "Times New Roman"
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#e5e5e5>
<TD vAlign=center><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/index.html"><FONT
color=#004faf>主页</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/classes.html"><FONT
color=#004faf>所有的类</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/mainclasses.html"><FONT
color=#004faf>主要的类</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/annotated.html"><FONT
color=#004faf>注释的类</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/groups.html"><FONT
color=#004faf>分组的类</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/functions.html"><FONT
color=#004faf>函数</FONT></A> </TD>
<TD vAlign=center align=right><IMG height=32
src="Qt教程一 —— 第九章:你可以使用加农炮了.files/logo32.png" width=64 align=right
border=0></TD></TR></TBODY></TABLE>
<H1 align=center>Qt教程一 —— 第九章:你可以使用加农炮了</H1>
<P>
<CENTER><IMG alt="Screenshot of tutorial nine"
src="Qt教程一 —— 第九章:你可以使用加农炮了.files/t9.png"></CENTER>
<P>在这个例子中我们开始画一个蓝色可爱的小加农炮.只cannon.cpp和上一章不同。
<P>
<UL>
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-lcdrange-h.html">t9/lcdrange.h</A>包含LCDRange类定义。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-lcdrange-cpp.html">t9/lcdrange.cpp</A>包含LCDRange类实现。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-cannon-h.html">t9/cannon.h</A>包含CannonField类定义。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-cannon-cpp.html">t9/cannon.cpp</A>包含CannonField类实现。
<LI><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-main-cpp.html">t9/main.cpp</A>包含MyWidget和main。
</LI></UL>
<P>
<H2>一行一行地解说 </H2><A name=1></A>
<P>
<H3><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/t9-cannon-cpp.html">t9/cannon.cpp</A>
</H3><A name=1-1></A>
<P>
<P><PRE> <A name=x2278></A>void CannonField::<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#paintEvent">paintEvent</A>( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpaintevent.html">QPaintEvent</A> * )
{
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html">QPainter</A> p( this );
</PRE>
<P>我们现在开始认真地使用<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html">QPainter</A>。我们创建一个绘画工具来操作这个窗口部件。
<P><PRE> <A name=x2275></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#setBrush">setBrush</A>( blue );
</PRE>
<P>当一个QPainter填满一个矩形、圆或者其它无论什么,它会用它的画刷填满这个图形。这里我们把画刷设置为蓝色。(我们也可以使用一个调色板。)
<P><PRE> <A name=x2276></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#setPen">setPen</A>( NoPen );
</PRE>
<P>并且QPainter使用画笔来画边界。这里我们设置为NoPen,就是说我们在边界上什么都不画,蓝色画刷会在我们画的东西的边界内画满全部。
<P><PRE> <A name=x2277></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#translate">translate</A>( 0, rect().bottom() );
</PRE>
<P><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#translate">QPainter::translate</A>()函数转化QPainter的坐标系统,比如,它通过偏移谅来移动。这里我们设置窗口部件的左下角为(0,0)。x和y的方向没有改变,比如,窗口部件中的所有y坐标现在都是负数(请看<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/coordsys.html">坐标系统</A>获得有关Qt的坐标系统更多的信息。)
<P><PRE> <A name=x2272></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#drawPie">drawPie</A>( QRect(-35, -35, 70, 70), 0, 90*16 );
</PRE>
<P>drawPie()函数使用一个开始角度和弧长在一个指定的矩形内画一个饼型图。角度的度量用的是一度的十六分之一。零度在三点的位置。画的方向是顺时针的。这里我们在窗口部件的左下角画一个四分之一圆。这个饼图被蓝色充满,并且没有边框。
<P><PRE> <A name=x2274></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#rotate">rotate</A>( -ang );
</PRE>
<P><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#rotate">QPainter::rotate</A>()函数绕<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html">QPainter</A>坐标系统的初始位置旋转它。旋转的参数是一个按度数给定的<TT>浮点数</TT>(不是一个像上面那样给的十六分之一的度数)并且是顺时针的。这里我们顺时针旋转<TT>ang</TT>度数。
<P><PRE> <A name=x2273></A> p.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#drawRect">drawRect</A>( QRect(33, -4, 15, 8) );
</PRE>
<P><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpainter.html#drawRect">QPainter::drawRect</A>()函数画一个指定的矩形。这里我们画的是加农炮的炮筒。
<P>很难想象当坐标系统被转换之后(转化、旋转、缩放或者修剪)的绘画结果。
<P>在这种情况下,坐标系统先被转化后被旋转。如果矩形<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrect.html">QRect</A>(33, -4,
15, 8)被画到这个转化后的坐标系统中,它看起来会是这样:
<P>
<CENTER><IMG alt="The cannon translated but not rotated"
src="Qt教程一 —— 第九章:你可以使用加农炮了.files/t9_1.png"></CENTER>
<P>注意矩形被CannonField窗口部件的边界省略了一部分。当我们选装坐标系统,以60度为例,矩形会以(0,0)为圆心被旋转,也就是左下角,因为我们已经转化了坐标系统。结果会是这样:
<P>
<CENTER><IMG alt="The cannon translated and rotated"
src="Qt教程一 —— 第九章:你可以使用加农炮了.files/t9_2.png"></CENTER>
<P>我们做完了,除了我们还没有解释为什么Windows在这个时候没有发抖。
<P><PRE> int main( int argc, char **argv )
{
<A name=x2279></A> QApplication::<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html#setColorSpec">setColorSpec</A>( QApplication::CustomColor );
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html">QApplication</A> a( argc, argv );
</PRE>
<P>我们告诉Qt我们在这个程序中想使用一个不同的颜色分配策略。这里没有单一正确的颜色分配策略。因为这个程序使用了不常用的黄色,但不是很多颜色,<TT>CustomColor</TT>最好。这里有几个其它的分配策略,你可以在<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html#setColorSpec">QApplication::setColorSpec</A>()文档中读到它们。
<P>通常情况下你可以忽略这一点,因为默认的是好的。偶尔一些使用常用颜色的应用程序看起来比较糟糕,因而改变分配策略通常会有所帮助。
<P>
<H2>行为 </H2><A name=2></A>
<P>当滑块被操作的时候,所画的加农炮的角度会因此而变化。
<P>Quit中的字母Q现在有下划线,并且Alt+Q会实现你所要的。如果你不知道这些,你一定是没有做第八章中的练习。
<P>你也要注意加农炮的闪烁让人很烦,特别是在一个比较慢的机器上。我们将会在下一章修正这一点。
<P>(请看<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-07.html#compiling">编译</A>来学习如何创建一个makefile和连编应用程序。)
<P>
<H2>练习 </H2><A name=3></A>
<P>设置一个不同的画笔代替NoPen。设置一个调色板的画刷。
<P>试着用“Q&uit”或者“Qu&it”作为按钮的文本来提到“&Quit”。发生了什么?
<P>现在你可以进行<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-10.html">第十章</A>了。
<P>[<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-08.html">上一章</A>]
[<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-10.html">下一章</A>]
[<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial.html">教程一主页</A>]
<P><!-- eof -->
<P>
<ADDRESS>
<HR>
<DIV align=center>
<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD>Copyright © 2002 <A href="http://www.trolltech.com/">Trolltech</A>
<TD><A href="http://www.trolltech.com/trademarks.html">Trademarks</A>
<TD><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/zh_CN.html">译者:Cavendish</A>
<TD align=right>
<DIV align=right>Qt
3.0.5版</DIV></TR></TBODY></TABLE></DIV></ADDRESS></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -