﻿<?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++博客-mirguest</title><link>http://www.cppblog.com/mirguest/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:09:59 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:09:59 GMT</pubDate><ttl>60</ttl><item><title>关于隐藏实现代码</title><link>http://www.cppblog.com/mirguest/archive/2012/06/23/179871.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sat, 23 Jun 2012 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/06/23/179871.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/179871.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/06/23/179871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/179871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/179871.html</trackback:ping><description><![CDATA[<h1>关于隐藏实现代码</h1>
<p>C++ 一直没有学明白，对于一些问题，一直也没有解决。
今天尝试解决的问题，来源于微软如何把它的库实现隐藏起来。</p>
<p>之前的想法是，不管定义何种类和方法，总应该在头文件中出现声明，
从而，一些private的方法和变量我们也应该可以推断出来。
但是，事实并不是这样，很多时候，看到的只是public的。</p>
<p>而从理论上来说，应该将实现与接口分离。像微软提供的头文件，
的确已经定义好了固定的接口。而这样，它们只需要再提供类库，
我们就可以用了。</p>

<div class="section" id="id2">
<h1>定义接口</h1>
<p>首先，定义一个称为 MyClass 的类，为了方便，我创建了一个目录，
专门用于存放编译我们自己类库的代码。</p>
<p>MyClass.h 的代码非常简单：</p>
<pre class="literal-block">#ifndef MyClass_H
#define MyClass_H
class MyClass {
public:
void run();
};
#endif
</pre>
<p>这个之后会暴露给用户。但我们先不进行实现。</p>
</div>
<div class="section" id="id3">
<h1>实现隐藏代码</h1>
<p>下面，做的是真正的工作，即我们不需要给用户看的。</p>
<p>定义 PrivateMyClass.h 和 PrivateMyClass.cpp 。</p>
<p>PrivateMyClass.h 内容很简单：</p>
<pre class="literal-block">#ifndef PrivateMyClass_H
#define PrivateMyClass_H
class PrivateMyClass {
public:
void canrun();
};
#endif
</pre>
<p>PrivateMyClass.cpp 也简单：</p>
<pre class="literal-block">#include &lt;iostream&gt;
#include "PrivateMyClass.h"
void PrivateMyClass::canrun() {
std::cout &lt;&lt; "Begin Can RUN?" &lt;&lt; std::endl;
std::cout &lt;&lt; "End Can RUN?" &lt;&lt; std::endl;
}
</pre>
</div>
<div class="section" id="id4">
<h1>封装隐藏代码</h1>
<p>然后，我们在 MyClass 的实现中，调用 PrivateMyClass 。</p>
<p>MyClass.cpp 内容：</p>
<pre class="literal-block">#include &lt;iostream&gt;
#include "MyClass.h"
#include "PrivateMyClass.h"
void MyClass::run() {
std::cout &lt;&lt; "Begin RUN" &lt;&lt; std::endl;
PrivateMyClass pmc;
pmc.canrun();
std::cout &lt;&lt; "End RUN" &lt;&lt; std::endl;
}
</pre>
</div>
<div class="section" id="id5">
<h1>编译生成动态库</h1>
<p>有了这些，就可以编译出动态库了，写一个 Makefile ：</p>
<pre class="literal-block">lib:MyClass.o PrivateMyClass.o
&nbsp;&nbsp;&nbsp;g++ -g -shared -o libresult.so MyClass.o PrivateMyClass.o
MyClass.o:MyClass.cpp MyClass.h
&nbsp;&nbsp;&nbsp;g++ -fPIC -Wall -g -c MyClass.cpp
PrivateMyClass.o:PrivateMyClass.cpp PrivateMyClass.h
&nbsp;&nbsp;&nbsp;g++ -fPIC -Wall -g -c PrivateMyClass.cpp
</pre>
</div>
<div class="section" id="id6">
<h1>给出头文件和动态库</h1>
<p>这样，我们就可把 MyClass.h 和 libresult.so 给用户了。
我放到public的目录下。</p>
</div>
<div class="section" id="id7">
<h1>测试</h1>
<p>为了确保正常运行，写代码测试一下：</p>
<pre class="literal-block">#include "MyClass.h"
int main() {
MyClass mc;
mc.run();
}
</pre>
<p>然后是Makefile：</p>
<pre class="literal-block">all:exe
&nbsp;&nbsp;&nbsp;LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./result
test1:exe
&nbsp;&nbsp;&nbsp;LD_LIBRARY_PATH=../private/:$LD_LIBRARY_PATH ./result
test2:exe
&nbsp;&nbsp;&nbsp;LD_LIBRARY_PATH=../private-v2/:$LD_LIBRARY_PATH ./result
exe:TestClass.o
&nbsp;&nbsp;&nbsp;g++ -o result TestClass.o -L. -lresult
TestClass.o:TestClass.cpp
&nbsp;&nbsp;&nbsp;g++ -c TestClass.cpp
</pre>
<p>这个里面，包含了另外的一个测试：即库更新后，
我是否可以不重新编译用户代码。</p>
<p>结论是，可以不用重新编译用户代码。</p>
 </div><div class="vimiumReset vimiumHUD" style="right: 150px; opacity: 0; display: none; "></div><img src ="http://www.cppblog.com/mirguest/aggbug/179871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-06-23 16:14 <a href="http://www.cppblog.com/mirguest/archive/2012/06/23/179871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【笔记】设计原本中作者关于设计的建议</title><link>http://www.cppblog.com/mirguest/archive/2012/05/12/174669.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sat, 12 May 2012 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/05/12/174669.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/174669.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/05/12/174669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/174669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/174669.html</trackback:ping><description><![CDATA[<dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">1）专心研究以前设计者的工作，看看他们如何解决问题<br /></dd></dl><dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">2）尝试弄明白他们为什么做出那样的设计决定，这是对你自己最有启发性的问题<br /></dd></dl><dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">3）仔细研究以前设计者的风格。最好的方式是尝试用他们的一些风格勾画设计草图<br /></dd></dl><dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">4）保存一本&#8220;草图本&#8221;，将您的想法、设计和局部设计记录下来，不论使用何种媒质<br /></dd></dl><dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">5）在开始设计时，写下您对用户和使用方式的假定<br /></dd></dl><dl class="chatBox_myMsg"><dt class="msgHead" title="林韬"><span style="margin-left:5px"></span><br /></dt><dd class="msgBody defaultFontStyle" style="color:#000000;font-family:幼圆;font-size:12pt;font-weight:normal;font-style:normal;text-decoration:none;">6）设计、设计、设计！</dd></dl><img src ="http://www.cppblog.com/mirguest/aggbug/174669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-05-12 15:53 <a href="http://www.cppblog.com/mirguest/archive/2012/05/12/174669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]PyQt4 中的俄罗斯方块</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165392.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165392.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165392.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165392.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PyQt4 中的俄罗斯方块&#182;创建一个电脑游戏是很具挑战性的。迟早程序员想创建一个电脑游戏。事实上，很多人对编程感兴趣，是因为它们玩了游戏，然后想创建自己的游戏。创建一个游戏会提升你的编程技能。俄罗斯方块&#182;俄罗斯方块从创建开始就成为很流行的游戏之一。游戏最开始是由俄罗斯程序员 Alexey Pajitnov 设计和编写的。从那时开始几乎在所有的计算机平台运行。甚至...&nbsp;&nbsp;<a href='http://www.cppblog.com/mirguest/archive/2012/02/12/165392.html'>阅读全文</a><img src ="http://www.cppblog.com/mirguest/aggbug/165392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:18 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]在 PyQt4 中定制组件</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165391.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165391.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165391.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165391.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165391.html</trackback:ping><description><![CDATA[    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
  <div class="section" id="pyqt4">
<h1>在 PyQt4 中定制组件<a class="headerlink" href="#pyqt4" title="Permalink to this headline">&#182;</a></h1>
<p>PyQt4 有丰富的组件。但是不可能提供所有的组件。PyQt4 中仅仅提供最常用的组件，像按钮，文本框，滑块等。如果我们需要特殊的组件，我们必须要自己创建。</p>
<p>自定制组件可以使用工具包画制工具创建。有两种可能，一个程序员可以修改或提升一个已存在的工具，或是从零开始创建。</p>
<div class="section" id="burning-widget">
<h2>Burning widget<a class="headerlink" href="#burning-widget" title="Permalink to this headline">&#182;</a></h2>
<p>这是一个组件，我们可以在 Nero，K3B 或其它 CD/DVD 刻录软件。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we create a custom widget.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Communicate</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">QObject</span><span class="p">):</span>
    <span class="n">updateBW</span> <span class="o">=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">pyqtSignal</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">BurningWidget</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">BurningWidget</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setMinimumSize</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="mi">75</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">num</span> <span class="o">=</span> <span class="p">[</span><span class="mi">75</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">225</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">375</span><span class="p">,</span> <span class="mi">450</span><span class="p">,</span> <span class="mi">525</span><span class="p">,</span> <span class="mi">600</span><span class="p">,</span> <span class="mi">675</span><span class="p">]</span>
    <span class="k">def</span> <span class="nf">setValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
    <span class="k">def</span> <span class="nf">paintEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="n">qp</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPainter</span><span class="p">()</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">begin</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">drawWidget</span><span class="p">(</span><span class="n">qp</span><span class="p">)</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">end</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">drawWidget</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qp</span><span class="p">):</span>
        <span class="n">font</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFont</span><span class="p">(</span><span class="s">&#39;Serif&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFont</span><span class="o">.</span><span class="n">Light</span><span class="p">)</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">setFont</span><span class="p">(</span><span class="n">font</span><span class="p">)</span>
        <span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">()</span>
        <span class="n">w</span> <span class="o">=</span> <span class="n">size</span><span class="o">.</span><span class="n">width</span><span class="p">()</span>
        <span class="n">h</span> <span class="o">=</span> <span class="n">size</span><span class="o">.</span><span class="n">height</span><span class="p">()</span>
        <span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">w</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">))</span>
        <span class="n">till</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(((</span><span class="n">w</span> <span class="o">/</span> <span class="mf">750.0</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
        <span class="n">full</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(((</span><span class="n">w</span> <span class="o">/</span> <span class="mf">750.0</span><span class="p">)</span> <span class="o">*</span> <span class="mi">700</span><span class="p">))</span>
        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">&gt;=</span> <span class="mi">700</span><span class="p">:</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setPen</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setBrush</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">184</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">drawRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">full</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setPen</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">175</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setBrush</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">175</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">drawRect</span><span class="p">(</span><span class="n">full</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">till</span><span class="o">-</span><span class="n">full</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setPen</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">setBrush</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">184</span><span class="p">))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">drawRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">till</span><span class="p">,</span> <span class="n">h</span><span class="p">)</span>
        <span class="n">pen</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPen</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span>
            <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">SolidLine</span><span class="p">)</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">setPen</span><span class="p">(</span><span class="n">pen</span><span class="p">)</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">setBrush</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">NoBrush</span><span class="p">)</span>
        <span class="n">qp</span><span class="o">.</span><span class="n">drawRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">w</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">h</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">step</span><span class="p">,</span> <span class="mi">10</span><span class="o">*</span><span class="n">step</span><span class="p">,</span> <span class="n">step</span><span class="p">):</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">drawLine</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
            <span class="n">metrics</span> <span class="o">=</span> <span class="n">qp</span><span class="o">.</span><span class="n">fontMetrics</span><span class="p">()</span>
            <span class="n">fw</span> <span class="o">=</span> <span class="n">metrics</span><span class="o">.</span><span class="n">width</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span>
            <span class="n">qp</span><span class="o">.</span><span class="n">drawText</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">fw</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">h</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span>
            <span class="n">j</span> <span class="o">=</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">sld</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSlider</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Horizontal</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">setFocusPolicy</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">NoFocus</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">setRange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">750</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">setValue</span><span class="p">(</span><span class="mi">75</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="o">=</span> <span class="n">Communicate</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">wid</span> <span class="o">=</span> <span class="n">BurningWidget</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">updateBW</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wid</span><span class="o">.</span><span class="n">setValue</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">valueChanged</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">changeValue</span><span class="p">)</span>
        <span class="n">hbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QHBoxLayout</span><span class="p">()</span>
        <span class="n">hbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wid</span><span class="p">)</span>
        <span class="n">vbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QVBoxLayout</span><span class="p">()</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addStretch</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addLayout</span><span class="p">(</span><span class="n">hbox</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">vbox</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">390</span><span class="p">,</span> <span class="mi">210</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Burning widget&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">changeValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">updateBW</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">wid</span><span class="o">.</span><span class="n">repaint</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在这个例子中，我们有一个 <tt class="docutils literal"><span class="pre">QtGui.QSlider</span></tt> 和一个自定制组件。滑块控制了自定制组件。这个组件显示一个媒介总的容量以及剩余的容量。这里最小的值是 1，最大是 750 。如果我们到达 700 ，我们开始画红色。这是用于指示过度烧制。</p>
<p>组件放在窗口的底部。这通过一个 <tt class="docutils literal"><span class="pre">QtGui.QHBoxLayout</span></tt> 和 <tt class="docutils literal"><span class="pre">QtGui.QVBoxLayout</span></tt> 实现。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">BurningWidget</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">BurningWidget</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
</pre></div>
</div>
<p>这个组件基于 <tt class="docutils literal"><span class="pre">QtGui.QWidget</span></tt> 组件。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="bp">self</span><span class="o">.</span><span class="n">setMinimumSize</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>
</pre></div>
</div>
<p>我们更改了组件最小的大小（高度）。默认的值是一点点小。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">font</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFont</span><span class="p">(</span><span class="s">&#39;Serif&#39;</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFont</span><span class="o">.</span><span class="n">Light</span><span class="p">)</span>
<span class="n">qp</span><span class="o">.</span><span class="n">setFont</span><span class="p">(</span><span class="n">font</span><span class="p">)</span>
</pre></div>
</div>
<p>我们用小于默认的字体。这适合于我们的需要。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">()</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">size</span><span class="o">.</span><span class="n">width</span><span class="p">()</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">size</span><span class="o">.</span><span class="n">height</span><span class="p">()</span>
<span class="n">step</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">w</span> <span class="o">/</span> <span class="mf">10.0</span><span class="p">))</span>
<span class="n">till</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(((</span><span class="n">w</span> <span class="o">/</span> <span class="mf">750.0</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="n">full</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(((</span><span class="n">w</span> <span class="o">/</span> <span class="mf">750.0</span><span class="p">)</span> <span class="o">*</span> <span class="mi">700</span><span class="p">))</span>
</pre></div>
</div>
<p>我们动态地绘制组件。窗口越大，组件会越大。反之亦然。这就是为何我们要计算组件的大小。参数 till 决定了要画多少。此值来自于滑块组件。这是整个区域的部分值。参数 full 决定了什么时候开始绘制红色部分。注意，此处使用了浮点运算，是为更高的精度。</p>
<p>真正绘制时包含三个部分。我们先绘制黄色或红色和黄色的矩形。然后绘制垂直的线，主要用于分割组件。最后是绘制数字，用于指示媒介的大小。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">metrics</span> <span class="o">=</span> <span class="n">qp</span><span class="o">.</span><span class="n">fontMetrics</span><span class="p">()</span>
<span class="n">fw</span> <span class="o">=</span> <span class="n">metrics</span><span class="o">.</span><span class="n">width</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span>
<span class="n">qp</span><span class="o">.</span><span class="n">drawText</span><span class="p">(</span><span class="n">i</span><span class="o">-</span><span class="n">fw</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="n">h</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span>
</pre></div>
</div>
<p>我们使用字体度量来绘制文本。我们必须要知道文本的宽度来居中绘制。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">changeValue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">updateBW</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">wid</span><span class="o">.</span><span class="n">repaint</span><span class="p">()</span>
</pre></div>
</div>
<p>我们移动滑块时， <tt class="docutils literal"><span class="pre">changeValue()</span></tt> 方法就被调用了。在此方法内部，我们发送了自定义的 updateBW 信号，并且带了一个参数。这个参数是当前滑块的值。这个值用于计算在 Burning 这个组件中要绘制多少。自定义的组件然后被重绘。</p>
<hr class="docutils" />
<p>本部分，我们创建了自己的组件。</p>
</div>
</div>
          </div>
        </div>
      </div>
<img src ="http://www.cppblog.com/mirguest/aggbug/165391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:17 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]在 PyQt4 中绘图</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165390.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165390.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165390.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165390.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165390.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165390.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在 PyQt4 中绘图&#182;绘图常用于，当我们想改变一个已存在的组件，或者是我们希望自己创建组件。为了实现绘图，我们可以使用 PyQt4 中提供的 API 。绘制一般由 paintEvent() 方法处理。绘制的代码放置于 QtGui.QPainter 对象的 begin() 与 end() 之间。绘制文本&#182;我们可以把一些 Unicode 文本绘制到屏幕上。...&nbsp;&nbsp;<a href='http://www.cppblog.com/mirguest/archive/2012/02/12/165390.html'>阅读全文</a><img src ="http://www.cppblog.com/mirguest/aggbug/165390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:16 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]在 PyQt4 中 drag 和 drop</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165389.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165389.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165389.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165389.html</trackback:ping><description><![CDATA[    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
  <div class="section" id="pyqt4-drag-drop">
<h1>在 PyQt4 中 drag 和 drop<a class="headerlink" href="#pyqt4-drag-drop" title="Permalink to this headline">&#182;</a></h1>
<p>本部分，我们将讨论 drag 和 drop 操作。</p>
<p>在计算机中的图形界面中， drag-and-drop 是例如点击到一个虚拟对象并把它拖到另外的位置上的行为。一般来说，这可以用于很多行为，或创建两个对象间的关联。（Wikipedia）</p>
<p>drag 和 drop 的功能是 GUI 最有用的功能之一。它可以是用户处理复杂的工作。</p>
<p>一般来说，我们可以 drag 和 drop 两种东西，数据或图形对象。如果我们吧一幅图像从一个应用拖到另一个应用，我们处理的是二进制数据。如果我们在 Firefox 中拖动了一个标签，我们拖的则是一个图形组件。</p>
<div class="section" id="drag-drop">
<h2>简单的 Drag 和 Drop<a class="headerlink" href="#drag-drop" title="Permalink to this headline">&#182;</a></h2>
<p>第一个例子，我们将有一个 <tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt> 和 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 。我们将从行编辑区拖动文本到按钮上。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">This is a simple drag and</span>
<span class="sd">drop example.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: December 2010</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="k">class</span> <span class="nc">Button</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Button</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setAcceptDrops</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">dragEnterEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">mimeData</span><span class="p">()</span><span class="o">.</span><span class="n">hasFormat</span><span class="p">(</span><span class="s">&#39;text/plain&#39;</span><span class="p">):</span>
            <span class="n">e</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">e</span><span class="o">.</span><span class="n">ignore</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">dropEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">mimeData</span><span class="p">()</span><span class="o">.</span><span class="n">text</span><span class="p">())</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">edit</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLineEdit</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">edit</span><span class="o">.</span><span class="n">setDragEnabled</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">edit</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">65</span><span class="p">)</span>
        <span class="n">button</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="s">&quot;Button&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">button</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">190</span><span class="p">,</span> <span class="mi">65</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Simple Drag &amp; Drop&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">ex</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">()</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>简单的拖拽操作。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Button</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Button</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
</pre></div>
</div>
<p>为了可以把文字拖到 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 组件上，我们必需要重新实现一些方法。所以我们创建了我们自己的按钮类。它从 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 派生。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="bp">self</span><span class="o">.</span><span class="n">setAcceptDrops</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
</pre></div>
</div>
<p>我们开启允许接受拖入的事件。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">dragEnterEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">mimeDate</span><span class="p">()</span><span class="o">.</span><span class="n">hasFormat</span><span class="p">(</span><span class="s">&#39;text/plain&#39;</span><span class="p">):</span>
        <span class="n">e</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">e</span><span class="o">.</span><span class="n">ignore</span><span class="p">()</span>
</pre></div>
</div>
<p>首先，我们重新实现了 <tt class="docutils literal"><span class="pre">drageEnterEvent()</span></tt> 方法。我们将接受特定的数据类型，此处是纯文本。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">dropEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">mimeDate</span><span class="p">()</span><span class="o">.</span><span class="n">text</span><span class="p">())</span>
</pre></div>
</div>
<p>通过重新实现 <tt class="docutils literal"><span class="pre">dropEvent()</span></tt> 方法，我们定义了放下后处理的事件。我们在这里是改变了按钮中的显示文本。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">edit</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLineEdit</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="n">edit</span><span class="o">.</span><span class="n">setDragEnabled</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt> 组件有内置的拖拽操作。我们只需要调用 <tt class="docutils literal"><span class="pre">setDragEnabled()</span></tt> 激活它就可以了。</p>
</div>
<div class="section" id="id1">
<h2>拖拽一个按钮组件<a class="headerlink" href="#id1" title="Permalink to this headline">&#182;</a></h2>
<p>下面的例子，我们将介绍如何拖拽一个按钮对象。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this program, we can press</span>
<span class="sd">on a button with a left mouse</span>
<span class="sd">click or drag and drop the button</span>
<span class="sd">with  the right mouse click.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: December 2010</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Button</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Button</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">mouseMoveEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">buttons</span><span class="p">()</span> <span class="o">!=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">RightButton</span><span class="p">:</span>
            <span class="k">return</span>
        <span class="n">mimeData</span> <span class="o">=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">QMimeData</span><span class="p">()</span>
        <span class="n">drag</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QDrag</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">drag</span><span class="o">.</span><span class="n">setMimeData</span><span class="p">(</span><span class="n">mimeData</span><span class="p">)</span>
        <span class="n">drag</span><span class="o">.</span><span class="n">setHotSpot</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">pos</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="p">()</span><span class="o">.</span><span class="n">topLeft</span><span class="p">())</span>
        <span class="n">dropAction</span> <span class="o">=</span> <span class="n">drag</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">MoveAction</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="o">.</span><span class="n">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">button</span><span class="p">()</span> <span class="o">==</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">LeftButton</span><span class="p">:</span>
            <span class="k">print</span> <span class="s">&#39;press&#39;</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setAcceptDrops</span><span class="p">(</span><span class="bp">True</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">button</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="s">&#39;Button&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">button</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">65</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Click or Move&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">280</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
    <span class="k">def</span> <span class="nf">dragEnterEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="n">e</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">dropEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="n">position</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">pos</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">button</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">position</span><span class="p">)</span>
        <span class="n">e</span><span class="o">.</span><span class="n">setDropAction</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">MoveAction</span><span class="p">)</span>
        <span class="n">e</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">ex</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">()</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在这个例子中，我们有一个 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 在窗口上。如果我们点击按钮，将在控制台上输出 &#8216;press&#8217; 。而如果右击按钮并且移动，我们就可以拖拽这个按钮组件。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Button</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Button</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>
</pre></div>
</div>
<p>我们创建了一个派生自 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 的按钮类。我们还重新实现了 <tt class="docutils literal"><span class="pre">QtGui.QPushButton</span></tt> 中的两个方法， <tt class="docutils literal"><span class="pre">mouseMoveEvent()</span></tt> 和 <tt class="docutils literal"><span class="pre">mousePressEvent()</span></tt> 。其中， <tt class="docutils literal"><span class="pre">mouseMoveEvent()</span></tt> 方法是开始拖拽处发生的地方。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">buttons</span><span class="p">()</span> <span class="o">!=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">RightButton</span><span class="p">:</span>
    <span class="k">return</span>
</pre></div>
</div>
<p>我们决定只用鼠标右击进行拖拽。左击用于点击按钮。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">mimeData</span> <span class="o">=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">QMimeData</span><span class="p">()</span>
<span class="n">drag</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QDrag</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">drag</span><span class="o">.</span><span class="n">setMimeData</span><span class="p">(</span><span class="n">mimeData</span><span class="p">)</span>
<span class="n">drag</span><span class="o">.</span><span class="n">setHotSpot</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">pos</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="p">()</span><span class="o">.</span><span class="n">topLeft</span><span class="p">())</span>
</pre></div>
</div>
<p>我们创建了一个 <tt class="docutils literal"><span class="pre">QDrag</span></tt> 对象。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">dropAction</span> <span class="o">=</span> <span class="n">drag</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">MoveAction</span><span class="p">)</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">start()</span></tt> 方法开始拖拽操作。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="o">.</span><span class="n">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">button</span><span class="p">()</span> <span class="o">==</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">LeftButton</span><span class="p">:</span>
        <span class="k">print</span> <span class="s">&#39;press&#39;</span>
</pre></div>
</div>
<p>如果点击了鼠标左键，我们在控制台上打印 &#8216;press&#8217; 。注意，我们还调用了父类的 <tt class="docutils literal"><span class="pre">mousePressEvent()</span></tt> 方法。否则，我们将不会看到按钮被按下。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">position</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">pos</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">button</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">position</span><span class="p">)</span>
</pre></div>
</div>
<p>在 <tt class="docutils literal"><span class="pre">dropEvent()</span></tt> 方法中，定义了当我们松开鼠标按钮停止拖拽的行为。我们找到鼠标当前的位置，并把按钮移到合适的位置。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">e</span><span class="o">.</span><span class="n">setDropAction</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">MoveAction</span><span class="p">)</span>
<span class="n">e</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</pre></div>
</div>
<p>我们指定了拖拽的类型。在此处是移动的行为。</p>
<hr class="docutils" />
<p>本部分我们讨论了拖拽。</p>
</div>
</div>
          </div>
        </div>
      </div>
<img src ="http://www.cppblog.com/mirguest/aggbug/165389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:14 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]PyQt4 Widget II</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165388.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:13:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165388.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165388.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165388.html</trackback:ping><description><![CDATA[    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
  <div class="section" id="pyqt4-widget-ii">
<h1>PyQt4 Widget II<a class="headerlink" href="#pyqt4-widget-ii" title="Permalink to this headline">&#182;</a></h1>
<p>这里我们将继续介绍 PyQt4 组件。我们将涉及 <tt class="docutils literal"><span class="pre">QtGui.QPixmap</span></tt> ， <tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt> ， <tt class="docutils literal"><span class="pre">QtGui.QSplitter</span></tt> 和 <tt class="docutils literal"><span class="pre">QtGui.QComboBox</span></tt> 。</p>
<div class="section" id="qtgui-qpixmap">
<h2><tt class="docutils literal"><span class="pre">QtGui.QPixmap</span></tt><a class="headerlink" href="#qtgui-qpixmap" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QPixmap</span></tt> 是可以处理图片的组件之一。它对显示图片进行了优化。在我们的例子中，我们会用 <tt class="docutils literal"><span class="pre">QtGui.QPixmap</span></tt> 来显示图片。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we dispay an image</span>
<span class="sd">on the window.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: September 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">hbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QHBoxLayout</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">pixmap</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPixmap</span><span class="p">(</span><span class="s">&quot;redrock.png&quot;</span><span class="p">)</span>
        <span class="n">lbl</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLabel</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">lbl</span><span class="o">.</span><span class="n">setPixmap</span><span class="p">(</span><span class="n">pixmap</span><span class="p">)</span>
        <span class="n">hbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">hbox</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Red Rock&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在这个例子里，我们显示了一幅图片。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">pixmap</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPixmap</span><span class="p">(</span><span class="s">&quot;redrock.png&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>我们创建了一个 <tt class="docutils literal"><span class="pre">QtGui.QPixmap</span></tt> 对象。它接受文件名作为参数。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">lbl</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLabel</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">lbl</span><span class="o">.</span><span class="n">setPixmap</span><span class="p">(</span><span class="n">pixmap</span><span class="p">)</span>
</pre></div>
</div>
<p>我们把 pixmap 放到了 <tt class="docutils literal"><span class="pre">QtGui.QLabel</span></tt> 中。</p>
</div>
<div class="section" id="qtgui-qlineedit">
<h2><tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt><a class="headerlink" href="#qtgui-qlineedit" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt> 是一个允许输入和编辑一行纯文本。这个组件中可以撤销/恢复，剪切/粘贴以及拖拉。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">This example shows text which</span>
<span class="sd">is entered in a QtGui.QLineEdit</span>
<span class="sd">in a QtGui.QLabel widget.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: August 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLabel</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">qle</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLineEdit</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">qle</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">60</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
        <span class="n">qle</span><span class="o">.</span><span class="n">textChanged</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">onChanged</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">280</span><span class="p">,</span> <span class="mi">170</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;QtGui.QLineEdit&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">adjustSize</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子显示一个行编辑区和一个标签。我们输入的就会立即在标签中显示。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">qle</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLineEdit</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
<p>创建了 <tt class="docutils literal"><span class="pre">QtGui.QLineEdit</span></tt> 组件。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">qle</span><span class="o">.</span><span class="n">textChanged</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">onChanged</span><span class="p">)</span>
</pre></div>
</div>
<p>如果文本区的文本改变了，我们就调用 <tt class="docutils literal"><span class="pre">onChanged()</span></tt> 方法。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">onChanged</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">adjustSize</span><span class="p">()</span>
</pre></div>
</div>
<p>在 <tt class="docutils literal"><span class="pre">onChanged()</span></tt> 方法中，我们把输入的文本放到了标签中。通过调用 <tt class="docutils literal"><span class="pre">adjustSize()</span></tt> 方法，我们把标签设置到文本的长度。</p>
</div>
<div class="section" id="qtgui-qsplitter">
<h2><tt class="docutils literal"><span class="pre">QtGui.QSplitter</span></tt><a class="headerlink" href="#qtgui-qsplitter" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QSplitter</span></tt> 可以让用户控制子组件的大小，通过拖动子组件的大小。在我们的例子中，我们的三个 <tt class="docutils literal"><span class="pre">QtGui.QFrame</span></tt> 将由两个 splitter 分割。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">This example shows</span>
<span class="sd">how to use QtGui.QSplitter widget.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: September 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">hbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QHBoxLayout</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">topleft</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">topleft</span><span class="o">.</span><span class="n">setFrameShape</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="o">.</span><span class="n">StyledPanel</span><span class="p">)</span>
        <span class="n">topright</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">topright</span><span class="o">.</span><span class="n">setFrameShape</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="o">.</span><span class="n">StyledPanel</span><span class="p">)</span>
        <span class="n">bottom</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">bottom</span><span class="o">.</span><span class="n">setFrameShape</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="o">.</span><span class="n">StyledPanel</span><span class="p">)</span>
        <span class="n">splitter1</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSplitter</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Horizontal</span><span class="p">)</span>
        <span class="n">splitter1</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">topleft</span><span class="p">)</span>
        <span class="n">splitter1</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">topright</span><span class="p">)</span>
        <span class="n">splitter2</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSplitter</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Vertical</span><span class="p">)</span>
        <span class="n">splitter2</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">splitter1</span><span class="p">)</span>
        <span class="n">splitter2</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">bottom</span><span class="p">)</span>
        <span class="n">hbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">splitter2</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">hbox</span><span class="p">)</span>
        <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="o">.</span><span class="n">setStyle</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QStyleFactory</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s">&#39;Cleanlooks&#39;</span><span class="p">))</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;QtGui.QSplitter&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在这个例子中，有三个框架组件，两个分割条。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">topleft</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">topleft</span><span class="o">.</span><span class="n">setFrameShape</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="o">.</span><span class="n">StyledPanel</span><span class="p">)</span>
</pre></div>
</div>
<p>我们使用了有样式的框架，主要用于看到边框。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">splitter1</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSplitter</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Horizontal</span><span class="p">)</span>
<span class="n">splitter1</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">topleft</span><span class="p">)</span>
<span class="n">splitter1</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">topright</span><span class="p">)</span>
</pre></div>
</div>
<p>我们创建了一个 <tt class="docutils literal"><span class="pre">QtGui.QSplitter</span></tt> 组件，并添加到两个框架。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">splitter2</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSplitter</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Vertical</span><span class="p">)</span>
<span class="n">splitter2</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">splitter1</span><span class="p">)</span>
</pre></div>
</div>
<p>我们也可以把一个 splitter 添加到 splitter 中。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="o">.</span><span class="n">setStyle</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QStyleFactory</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s">&#39;Cleanlooks&#39;</span><span class="p">))</span>
</pre></div>
</div>
<p>我们使用一个简洁的样式。在有些样式中，框架是不可见的。</p>
</div>
<div class="section" id="qtgui-qcombobox">
<h2><tt class="docutils literal"><span class="pre">QtGui.QComboBox</span></tt><a class="headerlink" href="#qtgui-qcombobox" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QComboBox</span></tt> 允许用户从一组选项中选取一个。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">This example shows</span>
<span class="sd">how to use QtGui.QComboBox widget.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: September 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLabel</span><span class="p">(</span><span class="s">&quot;Ubuntu&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">combo</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QComboBox</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Ubuntu&quot;</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Mandriva&quot;</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Fedora&quot;</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Red Hat&quot;</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Gentoo&quot;</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="n">combo</span><span class="o">.</span><span class="n">activated</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">onActivated</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;QtGui.QComboBox&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">onActivated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">adjustSize</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子中有一个 <tt class="docutils literal"><span class="pre">QtGui.QComboBox</span></tt> 和 <tt class="docutils literal"><span class="pre">QtGui.QLable</span></tt> 。这里有五个选项。它们是 Linux 的发行版。标签中就会显示选中的项目。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">combo</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QComboBox</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Ubuntu&quot;</span><span class="p">)</span>
<span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Mandriva&quot;</span><span class="p">)</span>
<span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Fedora&quot;</span><span class="p">)</span>
<span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Red Hat&quot;</span><span class="p">)</span>
<span class="n">combo</span><span class="o">.</span><span class="n">addItem</span><span class="p">(</span><span class="s">&quot;Gentoo&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>我们创建一个 <tt class="docutils literal"><span class="pre">QtGui.QComboBox</span></tt> 组件并增加了五个选项。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">combo</span><span class="o">.</span><span class="n">activated</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">onActivated</span><span class="p">)</span>
</pre></div>
</div>
<p>当选择一个选项后，我们调用了 <tt class="docutils literal"><span class="pre">onActivated()</span></tt> 方法。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">onActivated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">adjustSize</span><span class="p">()</span>
</pre></div>
</div>
<p>在这个方法中，我们把选中的选项的文本放到标签中。我们还调整标签的大小。</p>
<hr class="docutils" />
<p>在本部分，我们涉及了另外四个 PyQt4 组件。</p>
</div>
</div>
          </div>
        </div>
      </div>
<img src ="http://www.cppblog.com/mirguest/aggbug/165388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:13 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]PyQt4 Widget</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165387.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:11:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165387.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165387.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165387.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: PyQt4 Widget&#182;组件（Widget）是一个应用最基本的构件。PyQt4 中有大量的组件。按钮，选择框，滑块，列表等等。任何一个程序员都会需要这些组件。这篇中，我们将介绍一些有用的组件， QtGui.QCheckBox ， ToggleButton ， QtGui.QSlider , QtGui.QProcessBar 和 QtGui.QCalendarWidget 。...&nbsp;&nbsp;<a href='http://www.cppblog.com/mirguest/archive/2012/02/12/165387.html'>阅读全文</a><img src ="http://www.cppblog.com/mirguest/aggbug/165387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:11 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]PyQt4 中的 Dialog</title><link>http://www.cppblog.com/mirguest/archive/2012/02/12/165386.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 12 Feb 2012 02:06:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/12/165386.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/165386.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/12/165386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/165386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/165386.html</trackback:ping><description><![CDATA[<div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
  <div class="section" id="pyqt4-dialog">
<h1>PyQt4 中的 Dialog<a class="headerlink" href="#pyqt4-dialog" title="Permalink to this headline">&#182;</a></h1>
<p>Dialog 窗口或 dialog 是现代 GUI 应用必不可少的一部分。一个 dialog 定义为两人或更多人间的会话。在计算机应用中，dialog 就是一个和应用说话的窗口。dialog 可以用于输入数据，修改数据，更改应用的设置等等。对话框在用户和计算机的通信间是重要的手段。</p>
<div class="section" id="qtgui-qinputdialog">
<h2><tt class="docutils literal"><span class="pre">QtGui.QInputDialog</span></tt><a class="headerlink" href="#qtgui-qinputdialog" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QInputDialog</span></tt> 提供了一个简单方便的对话框，用于获取用户输入的一个值。输入值可以是字符串，数字，或者一个列表中的一项。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we receive data from</span>
<span class="sd">a QtGui.QInputDialog dialog.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">(</span><span class="s">&#39;Dialog&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">showDialog</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">le</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLineEdit</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">le</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">130</span><span class="p">,</span> <span class="mi">22</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">290</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Input dialog&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">showDialog</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">text</span><span class="p">,</span> <span class="n">ok</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QInputDialog</span><span class="o">.</span><span class="n">getText</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;Input Dialog&#39;</span><span class="p">,</span>
            <span class="s">&#39;Enter your name:&#39;</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">le</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">text</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子中用到了一个按钮和一个行编辑组件。按钮会显示一个输入对话框用于得到文本。而输入的文本将在行编辑组件中显示。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">text</span><span class="p">,</span> <span class="n">ok</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QInputDialog</span><span class="o">.</span><span class="n">getText</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;Input Dialog&#39;</span><span class="p">,</span>
    <span class="s">&#39;Enter your name:&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>这一行显示了输入对话框。第一个字符串是对话框的标题，第二个字符串则是对话框中的消息。对话框将返回输入的文本和一个布尔值。如果点击了 ok 按钮，则布尔值为 <tt class="docutils literal"><span class="pre">true</span></tt> ，否则为 <tt class="docutils literal"><span class="pre">false</span></tt> 。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">le</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">text</span><span class="p">))</span>
</pre></div>
</div>
<p>从对话框中接收到的文本就被设置到行编辑组件中。</p>
</div>
<div class="section" id="qtgui-qcolordialog">
<h2><tt class="docutils literal"><span class="pre">QtGui.QColorDialog</span></tt><a class="headerlink" href="#qtgui-qcolordialog" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QColorDialog</span></tt> 用于选取颜色值。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we select a color value</span>
<span class="sd">from the QtGui.QColorDialog and change the background</span>
<span class="sd">color of a QtGui.QFrame widget.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">col</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">(</span><span class="s">&#39;Dialog&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">btn</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">showDialog</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">frm</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFrame</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">frm</span><span class="o">.</span><span class="n">setStyleSheet</span><span class="p">(</span><span class="s">&quot;QWidget { background-color: </span><span class="si">%s</span><span class="s"> }&quot;</span>
            <span class="o">%</span> <span class="n">col</span><span class="o">.</span><span class="n">name</span><span class="p">())</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">frm</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">130</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">180</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Color dialog&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">showDialog</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">col</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QColorDialog</span><span class="o">.</span><span class="n">getColor</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">isValid</span><span class="p">():</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">frm</span><span class="o">.</span><span class="n">setStyleSheet</span><span class="p">(</span><span class="s">&quot;QWidget { background-color: </span><span class="si">%s</span><span class="s"> }&quot;</span>
                <span class="o">%</span> <span class="n">col</span><span class="o">.</span><span class="n">name</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子显示一个按钮和一个 <tt class="docutils literal"><span class="pre">QtGui.QFrame</span></tt> 。这个组件的背景被设为黑色。使用 <tt class="docutils literal"><span class="pre">QtGui.QColorDialog</span></tt> 可以改变其背景。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">col</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QColor</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</pre></div>
</div>
<p>这个是 <tt class="docutils literal"><span class="pre">QtGui.QFrame</span></tt> 的初始颜色。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">col</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QColorDialog</span><span class="o">.</span><span class="n">getColor</span><span class="p">()</span>
</pre></div>
</div>
<p>这一行将弹出 <tt class="docutils literal"><span class="pre">QtGui.QColorDialog</span></tt> 。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">col</span><span class="o">.</span><span class="n">isValid</span><span class="p">():</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">frm</span><span class="o">.</span><span class="n">setStyleSheet</span><span class="p">(</span><span class="s">&quot;QWidget { background-color: </span><span class="si">%s</span><span class="s"> }&quot;</span>
        <span class="o">%</span> <span class="n">col</span><span class="o">.</span><span class="n">name</span><span class="p">())</span>
</pre></div>
</div>
<p>我们检查颜色是否合法。如果点击了取消按钮，返回的就不是合法值。如果颜色合法，我们就用样式表更改背景颜色。</p>
</div>
<div class="section" id="qtgui-qfontdialog">
<h2><tt class="docutils literal"><span class="pre">QtGui.QFontDialog</span></tt><a class="headerlink" href="#qtgui-qfontdialog" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QFontDialog</span></tt> 用于选取字体。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we select a font name</span>
<span class="sd">and change the font of a label.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">vbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QVBoxLayout</span><span class="p">()</span>
        <span class="n">btn</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">(</span><span class="s">&#39;Dialog&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">btn</span><span class="o">.</span><span class="n">setSizePolicy</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QSizePolicy</span><span class="o">.</span><span class="n">Fixed</span><span class="p">,</span>
            <span class="n">QtGui</span><span class="o">.</span><span class="n">QSizePolicy</span><span class="o">.</span><span class="n">Fixed</span><span class="p">)</span>
        <span class="n">btn</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">btn</span><span class="p">)</span>
        <span class="n">btn</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">showDialog</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLabel</span><span class="p">(</span><span class="s">&#39;Knowledge only matters&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">130</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">vbox</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">180</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Font dialog&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">showDialog</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">font</span><span class="p">,</span> <span class="n">ok</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFontDialog</span><span class="o">.</span><span class="n">getFont</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">lbl</span><span class="o">.</span><span class="n">setFont</span><span class="p">(</span><span class="n">font</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在我们的例子中，我们有一个按钮和一个标签。通过 <tt class="docutils literal"><span class="pre">QtGui.QFontDialog</span></tt> 我们可以改变标签的字体。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">font</span><span class="p">,</span> <span class="n">ok</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFontDialog</span><span class="o">.</span><span class="n">getFont</span><span class="p">()</span>
</pre></div>
</div>
<p>我们弹出一个字体对话框。 <tt class="docutils literal"><span class="pre">getFont()</span></tt> 方法将返回字体的名称和 ok 参数。如果用户点击了 OK 那么就是 <tt class="docutils literal"><span class="pre">True</span></tt> ，否则为 <tt class="docutils literal"><span class="pre">False</span></tt> 。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">label</span><span class="o">.</span><span class="n">setFont</span><span class="p">(</span><span class="n">font</span><span class="p">)</span>
</pre></div>
</div>
<p>如果我们点击了 ok，标签的字体就可能改变。</p>
</div>
<div class="section" id="qtgui-qfiledialog">
<h2><tt class="docutils literal"><span class="pre">QtGui.QFileDialog</span></tt><a class="headerlink" href="#qtgui-qfiledialog" title="Permalink to this headline">&#182;</a></h2>
<p><tt class="docutils literal"><span class="pre">QtGui.QFileDialog</span></tt> 是允许用户选择文件或目录的对话框。文件可以用于打开或保存。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we select a file with a</span>
<span class="sd">QtGui.QFileDialog and display its contents</span>
<span class="sd">in a QtGui.QTextEdit.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QMainWindow</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">textEdit</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QTextEdit</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setCentralWidget</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">textEdit</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">statusBar</span><span class="p">()</span>
        <span class="n">openFile</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QAction</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QIcon</span><span class="p">(</span><span class="s">&#39;open.png&#39;</span><span class="p">),</span> <span class="s">&#39;Open&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">openFile</span><span class="o">.</span><span class="n">setShortcut</span><span class="p">(</span><span class="s">&#39;Ctrl+O&#39;</span><span class="p">)</span>
        <span class="n">openFile</span><span class="o">.</span><span class="n">setStatusTip</span><span class="p">(</span><span class="s">&#39;Open new File&#39;</span><span class="p">)</span>
        <span class="n">openFile</span><span class="o">.</span><span class="n">triggered</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">showDialog</span><span class="p">)</span>
        <span class="n">menubar</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">menuBar</span><span class="p">()</span>
        <span class="n">fileMenu</span> <span class="o">=</span> <span class="n">menubar</span><span class="o">.</span><span class="n">addMenu</span><span class="p">(</span><span class="s">&#39;&amp;File&#39;</span><span class="p">)</span>
        <span class="n">fileMenu</span><span class="o">.</span><span class="n">addAction</span><span class="p">(</span><span class="n">openFile</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">350</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;File dialog&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">showDialog</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">fname</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFileDialog</span><span class="o">.</span><span class="n">getOpenFileName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;Open file&#39;</span><span class="p">,</span>
                <span class="s">&#39;/home&#39;</span><span class="p">)</span>
        <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
        <span class="k">with</span> <span class="n">f</span><span class="p">:</span>
            <span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">textEdit</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子中有菜单栏，文本编辑区以及状态栏。菜单中的选项显示 <tt class="docutils literal"><span class="pre">QtGui.QFileDialog</span></tt> 用于选择文件。而文件的内容则载入到文本编辑区。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QMainWindow</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子是基于 <tt class="docutils literal"><span class="pre">QtGui.QMainWindow</span></tt> 组件，因为我们要在中心设置文本编辑区。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">fname</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QFileDialog</span><span class="o">.</span><span class="n">getOpenFileName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s">&#39;Open file&#39;</span><span class="p">,</span>
    <span class="s">&#39;/home&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>我们弹出 <tt class="docutils literal"><span class="pre">QtGui.QFileDialog</span></tt> 。在 <tt class="docutils literal"><span class="pre">getOpenFileName()</span></tt> 方法中第一个字符串是标题。第二个则是指定对话框的工作目录。默认情况下，文件过滤为所有文件（ <tt class="docutils literal"><span class="pre">*</span></tt> ）。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="s">&#39;r&#39;</span><span class="p">)</span>
<span class="k">with</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">textEdit</span><span class="o">.</span><span class="n">setText</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</pre></div>
</div>
<p>选择的文件将被读取，并且其文件内容设置到文本编辑区。</p>
<hr class="docutils" />
<p>这个部分，我们讨论了对话框。</p>
</div>
</div>
          </div>
        </div>
      </div>
<img src ="http://www.cppblog.com/mirguest/aggbug/165386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-12 10:06 <a href="http://www.cppblog.com/mirguest/archive/2012/02/12/165386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Python][PyQt4]PyQt4 中的事件和信号</title><link>http://www.cppblog.com/mirguest/archive/2012/02/05/164984.html</link><dc:creator>mirguest</dc:creator><author>mirguest</author><pubDate>Sun, 05 Feb 2012 02:05:00 GMT</pubDate><guid>http://www.cppblog.com/mirguest/archive/2012/02/05/164984.html</guid><wfw:comment>http://www.cppblog.com/mirguest/comments/164984.html</wfw:comment><comments>http://www.cppblog.com/mirguest/archive/2012/02/05/164984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mirguest/comments/commentRss/164984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mirguest/services/trackbacks/164984.html</trackback:ping><description><![CDATA[    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
  <div class="section" id="pyqt4">
<h1>PyQt4 中的事件和信号<a class="headerlink" href="#pyqt4" title="Permalink to this headline">&#182;</a></h1>
<p>在本部分，我们将会探讨事件和信号。</p>
<div class="section" id="id1">
<h2>事件<a class="headerlink" href="#id1" title="Permalink to this headline">&#182;</a></h2>
<p>在任何的 GUI 程序中，事件是很重要的部分。事件是由用户或操作系统产生的。当我们调用应用的 <tt class="docutils literal"><span class="pre">exec_()</span></tt> 时，应用就进入了主循环。主循环会接受事件并且把它们发送给对象。Trolltech 引入了一个独特的信号和槽机制。</p>
<p>事件是任何 GUI 程序中很重要的部分。所有 GUI 应用都是事件驱动的。一个应用对其生命期产生的不同的事件类型做出反应。事件是主要由应用的用户产生。但是，也可以通过其他方法产生，比如，网络通信，窗口的管理者，计时器。在事件模型中，有三个参与者：</p>
<ul class="simple">
<li>事件源（event source）</li>
<li>事件对象（event object）</li>
<li>事件目标（event target）</li>
</ul>
<p><strong>event source</strong> 是那些状态改变的对象。它产生事件。而 <strong>event object</strong> （Event）封装了事件源的状态改变。而 <strong>event target</strong> 则是需要被通知的。事件源把处理事件的任务委托给了事件目标。</p>
<p>当我们调用了应用的 <tt class="docutils literal"><span class="pre">exec_()</span></tt> 方法，应用就进入主循环了。主循环接受事件然后把他们发送给对象。信号和槽用于对象间的通信。当特定的事件发生时 <strong>信号</strong> 就被发送了。而 <strong>槽</strong> 则是任何 Python 中可调用的。当信号发送给了这个槽，槽就被调用了。</p>
</div>
<div class="section" id="api">
<h2>新的 API<a class="headerlink" href="#api" title="Permalink to this headline">&#182;</a></h2>
<p>PyQt 4.5 引入了新的 API 用于信号和槽。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">QtCore</span><span class="o">.</span><span class="n">QObject</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">button</span><span class="p">,</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">SIGNAL</span><span class="p">(</span><span class="s">&#39;clicked()&#39;</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">onClicked</span><span class="p">)</span>
</pre></div>
</div>
<p>这是旧式的 API 。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">button</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">onClicked</span><span class="p">)</span>
</pre></div>
</div>
<p>新式的更接近 Python 的标准。</p>
</div>
<div class="section" id="id2">
<h2>信号与槽<a class="headerlink" href="#id2" title="Permalink to this headline">&#182;</a></h2>
<p>这是一个简单的例子，描述 PyQt4 中的信号和槽。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we connect a signal</span>
<span class="sd">of a QtGui.QSlider to a slot</span>
<span class="sd">of a QtGui.QLCDNumber.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">lcd</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QLCDNumber</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
        <span class="n">sld</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QSlider</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Horizontal</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">vbox</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QVBoxLayout</span><span class="p">()</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">lcd</span><span class="p">)</span>
        <span class="n">vbox</span><span class="o">.</span><span class="n">addWidget</span><span class="p">(</span><span class="n">sld</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setLayout</span><span class="p">(</span><span class="n">vbox</span><span class="p">)</span>
        <span class="n">sld</span><span class="o">.</span><span class="n">valueChanged</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">lcd</span><span class="o">.</span><span class="n">display</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Signal &amp; slot&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在我们的例子中，我们显示了 <tt class="docutils literal"><span class="pre">QtGui.QLCDNumber</span></tt> 和 <tt class="docutils literal"><span class="pre">QtGui.QSlider</span></tt> 。通过拖拽滑块，我们就可以更改 lcd 的数字。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">sld</span><span class="o">.</span><span class="n">valueChanged</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">lcd</span><span class="o">.</span><span class="n">display</span><span class="p">)</span>
</pre></div>
</div>
<p>此处，我们把 slider 的信号 <tt class="docutils literal"><span class="pre">valueChanged</span></tt> 和 lcd 的槽 <tt class="docutils literal"><span class="pre">display</span></tt> 连接了起来。</p>
<p><strong>sender</strong> 是发送信号的对象。 <strong>receiver</strong> 是接受信号的对象。而 <strong>slot</strong> 是回馈信号的方法。</p>
</div>
<div class="section" id="id3">
<h2>重新实现事件处理句柄<a class="headerlink" href="#id3" title="Permalink to this headline">&#182;</a></h2>
<p>在 PyQt4 中事件的处理一般通过重新实现事件的句柄。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we reimplement an</span>
<span class="sd">event handler.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QWidget</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Event handler&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">keyPressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">key</span><span class="p">()</span> <span class="o">==</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Key_Escape</span><span class="p">:</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>在我们的例子中，我们重新实现了 <tt class="docutils literal"><span class="pre">keyPressEvent()</span></tt> 。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">keyPressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">key</span><span class="p">()</span> <span class="o">==</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">Qt</span><span class="o">.</span><span class="n">Key_Escape</span><span class="p">:</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>
</div>
<p>如果我们按 escape 键，那么应用就将终止。</p>
</div>
<div class="section" id="id4">
<h2>事件发送者<a class="headerlink" href="#id4" title="Permalink to this headline">&#182;</a></h2>
<p>有些时候，知道信号的发送者是很方便的。因此，PyQt4 有个 <tt class="docutils literal"><span class="pre">sender()</span></tt> 方法。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we determine the event sender</span>
<span class="sd">object.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QMainWindow</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">btn1</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">(</span><span class="s">&quot;Button 1&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">btn1</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
        <span class="n">btn2</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QPushButton</span><span class="p">(</span><span class="s">&quot;Button 2&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
        <span class="n">btn2</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="mi">150</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
        <span class="n">btn1</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">buttonClicked</span><span class="p">)</span>
        <span class="n">btn2</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">buttonClicked</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">statusBar</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">290</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Event sender&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">buttonClicked</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">statusBar</span><span class="p">()</span><span class="o">.</span><span class="n">showMessage</span><span class="p">(</span><span class="n">sender</span><span class="o">.</span><span class="n">text</span><span class="p">()</span> <span class="o">+</span> <span class="s">&#39; was pressed&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>这个例子中有两个按钮。在 <tt class="docutils literal"><span class="pre">buttonClicked()</span></tt> 方法中，我们通过调用 <tt class="docutils literal"><span class="pre">sender()</span></tt> 方法知道了哪个按钮被点击了。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">btn1</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">buttonClicked</span><span class="p">)</span>
<span class="n">btn2</span><span class="o">.</span><span class="n">clicked</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">buttonClicked</span><span class="p">)</span>
</pre></div>
</div>
<p>两个按钮都连接到相同的槽中。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">buttonClicked</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="n">sender</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sender</span><span class="p">()</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">statusBar</span><span class="p">()</span><span class="o">.</span><span class="n">showMessange</span><span class="p">(</span><span class="n">sender</span><span class="o">.</span><span class="n">text</span><span class="p">()</span> <span class="o">+</span> <span class="s">&quot; was pressed&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>我们通过调用 <tt class="docutils literal"><span class="pre">sender()</span></tt> 方法知道了消息源。在状态栏中，我们显示了被按的按钮的标签。</p>
</div>
<div class="section" id="id5">
<h2>发送信号<a class="headerlink" href="#id5" title="Permalink to this headline">&#182;</a></h2>
<p>由 <tt class="docutils literal"><span class="pre">QtCore.QObject</span></tt> 创建的对象可以发送信号。如果我们点击按钮，一个 <tt class="docutils literal"><span class="pre">clicked()</span></tt> 信号就被生成。在下面的例子中我们将看到如何发送信号。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c">#!/usr/bin/python</span>
<span class="c"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">ZetCode PyQt4 tutorial</span>
<span class="sd">In this example, we show how to emit a</span>
<span class="sd">custom signal.</span>
<span class="sd">author: Jan Bodnar</span>
<span class="sd">website: zetcode.com</span>
<span class="sd">last edited: October 2011</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">PyQt4</span> <span class="kn">import</span> <span class="n">QtGui</span><span class="p">,</span> <span class="n">QtCore</span>
<span class="k">class</span> <span class="nc">Communicate</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">QObject</span><span class="p">):</span>
    <span class="n">closeApp</span> <span class="o">=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">pyqtSignal</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Example</span><span class="p">(</span><span class="n">QtGui</span><span class="o">.</span><span class="n">QMainWindow</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">Example</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">initUI</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">initUI</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="o">=</span> <span class="n">Communicate</span><span class="p">()</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">closeApp</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setGeometry</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">290</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">setWindowTitle</span><span class="p">(</span><span class="s">&#39;Emit signal&#39;</span><span class="p">)</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
    <span class="k">def</span> <span class="nf">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">closeApp</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">app</span> <span class="o">=</span> <span class="n">QtGui</span><span class="o">.</span><span class="n">QApplication</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span>
    <span class="n">ex</span> <span class="o">=</span> <span class="n">Example</span><span class="p">()</span>
    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">app</span><span class="o">.</span><span class="n">exec_</span><span class="p">())</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;__main__&#39;</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
<p>我们创建了一个新的信号称为 closeApp 。这个信号在鼠标点击时将被发送。而这个信号又和 <tt class="docutils literal"><span class="pre">QtGui.QMainWindow</span></tt> 的 <tt class="docutils literal"><span class="pre">close()</span></tt> 槽相连接。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">class</span> <span class="nc">Communicate</span><span class="p">(</span><span class="n">QtCore</span><span class="o">.</span><span class="n">QObject</span><span class="p">):</span>
    <span class="n">closeApp</span> <span class="o">=</span> <span class="n">QtCore</span><span class="o">.</span><span class="n">pyqtSignal</span><span class="p">()</span>
</pre></div>
</div>
<p>我们创建了基于 <tt class="docutils literal"><span class="pre">QtCore.QObject</span></tt> 的类。当它被实例化后就创建了一个 closeApp 信号。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="o">=</span> <span class="n">Communicate</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">closeApp</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">)</span>
</pre></div>
</div>
<p>类 <tt class="docutils literal"><span class="pre">Communicate</span></tt> 的实例就被创建了。我们把 <tt class="docutils literal"><span class="pre">QtGui.QMainWindow</span></tt> 的 <tt class="docutils literal"><span class="pre">close()</span></tt> 槽连接到信号 closeApp 上。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">mousePressEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">closeApp</span><span class="o">.</span><span class="n">emit</span><span class="p">()</span>
</pre></div>
</div>
<p>当鼠标指针在窗口中点击，信号 closeApp 就被发送了。</p>
<hr class="docutils" />
<p>在这个部分，我们涉及了信号与槽。</p>
</div>
</div>
          </div>
        </div>
      </div>
<img src ="http://www.cppblog.com/mirguest/aggbug/164984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mirguest/" target="_blank">mirguest</a> 2012-02-05 10:05 <a href="http://www.cppblog.com/mirguest/archive/2012/02/05/164984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>