教程:使用QT建立Python GUI应用程序

作者:Alex Fedosov
翻译:单手拍掌


欢迎转载。转载时请保持版权信息的完整性
译者注:本教程使用的是QT3。QT的最新版本为4.5。

Python 是一种有着许多令人惊叹的特性的伟大语言,但其默认的GUI包(TkInter)相当难看。另外,谁愿意手工输入所有GUI代码呢?做为替代,一个更好的建立Python GUI程序的方法,就是使用Trolltech的Qt Designer,用所见即所得的方式创建漂亮的界面,然后用pyuic自动生成所需的代码(这是一个PyQT包所带的QT界面编译器。)Qt Designer也使得在项目中添加Python代码变得非常容易。(如果想您的应用程序做有用的事的,你无疑将需要编写一些代码。:))
因此,下面是一个如何使用Python和QT建立你的第一个程序的简短教程。

我们将创建一个小小的应用程序,接受用户输入,然后将输入内容添加到一个列表中,此外允许用户清除列表中的内容。

首先,需要安装以下软件包:

  • Python的2.X
  • PyQt的3.X
  • Qt Designer 3.X

我采用Fedora Core 1的默认安装,没有任何问题。我还测试了RedHat 9,也没有任何问题。情况因人而异。(注:RedHat 8.0版也应该可以工作,但它的Qt designer是旧版本,没有RH9和FC1的好用。)
如果一切就绪,就让我们开始吧。启动QT designer。在RedHat 9和Fedora Core 1,它位于在Programming->More Programming菜单。

QT Designer将会出现。就像这样:教程:使用QT建立Python GUI应用程序_第1张图片

在New->Open对话框,单击Dialog,并点击OK。

QT Designer会创建一个新的dialog canvas,并命名为Form1
教程:使用QT建立Python GUI应用程序_第2张图片

在左侧工具栏选择LineEdit工具并在canvas上创建一个编辑框。命名为lineEdit1。这将是获取用户输入的地方。
教程:使用QT建立Python GUI应用程序_第3张图片

现在,在左侧工具栏选择ListBox工具,并在canvas上建立一个列表框。命名为listBox1 。这将是我们存储用户输入的地方
教程:使用QT建立Python GUI应用程序_第4张图片

请注意,列表框中已经有一个项目。我们并不需要它,让我们来清掉它。双击列表框。弹出一个显示列表框中内容的对话框。点击Delete Item删除这个项目。然后单击OK。

现在,在左边工具栏选择PushButton工具并在canvas创建一个按钮。命名为pushButton1

双击该按钮,出现一个允许你修改按钮上显示文字的对话框。重新命名为X,然后单击OK。
教程:使用QT建立Python GUI应用程序_第5张图片
现在,我们来让按钮做一些事情。在Qt中的术语,按钮将发送一个signal,被slot接收。(slot就像一个对象的方法,作为事件的回应被调用,例如用户单击按钮。)请记住,当用户点击这个按钮的时候,我们要清除列表框。已经有内置的方法做到这一点,因此我们直接使用它。使用连接工具将一个signal连接到一个slot,该工具位于顶部工具栏的右侧,一个绿色方块上的红色箭头。就像这样:

下面是比较难的部分。选择了这个工具以后,点选X按钮并拖到列表框上。一旦拖到列表框上(列表框会加亮),你会看到一条从按钮到列表框的线,然后放开鼠标。另一个对话框会弹出,您可以在此明确的指定哪一对signal和slot连接。选择pushButton1作为发送者, signal为clicked()listBox1为接收者,clear()作为slot。然后单击OK。(这意味着当用户点击按钮时将删除列表框中的所有内容。)
教程:使用QT建立Python GUI应用程序_第6张图片

在上一步中,我们使用一个内置slot来完成工作。现在,我们来创建自己的slot:当用户输入内容按下回车键后,它会将编辑框的内容添加到列表框中。要创建一个新的slot(记住,它就是一个方法),从Edit菜单中选择Slots

将显示一个自定义slots的对话框。开始时是空的。单击New Function添加新的slot。将该功能命名为AddEntry()(不要忘了新名称中的括号),因为它在列表框中增加新的项目。不要更改任何其他设置,只需点击OK。(我们将在后面编写此方法的代码。)
教程:使用QT建立Python GUI应用程序_第7张图片

现在,我们有一个slot,我们可以将其他东西连接到它。回想一下,当用户输入一些内容按下回车键后,我们将增加一个项目到列表中。选择我们的好朋友--连接工具,连接编辑框到列表框。连接对话框将会再次弹出。这一次选择lineEdit1作为发送者,returnPressed()作为signal,Form1作为接收者,我们自己的AddEntry()作为slot。

最后,我们准备编写一些代码,来实现我们的AddEntry()方法。在Project Overview的右上角,双击窗口的form1.ui.h文件。(第二个,在你的主文件之后。)弹出一个显示这个文件文本的窗口。此文件就是你实现所有的自定义slots的地方,将会在编译过程中被包含进去。请注意,Qt designer已经将我们的AddEntry()函数放在了头文件中...不过是C++格式!不需要为此担心,我们仍然可以在大括号中使用Python代码,并且工作得很好。(Python的UI编译器足够聪明,完全可以理解Qt Designer生成的头文件。)唯一的问题是,Qt designer自动缩进代码,并且预期一行的末尾有分号,这自然会让Python混淆,并且缩进会把一切都搞得一团糟。或者,你可以用你喜欢的编辑器 (例如:vi)编辑此文件。(或者找出如何关闭自动缩进。)
教程:使用QT建立Python GUI应用程序_第8张图片
那么,我们要写些什么代码呢?我们必须完成三件事:

  • 从编辑框获取文字
  • 将文字插入到列表框
  • 清除编辑框

你定义的所有slots都是对话框的方法,它的所有部件都是对象,你可以看一下他们的名字。因此self.lineEdit1是编辑框,self.listBox1是列表框。编辑框有一个方法叫做text(),它返回一个包含编辑框中内容的QString对象。不需要知道这些对象太多的细节,只需要知道QString对象有一个ascii()方法,它将返回所输入文本的原始ASCII。因此,要获得编辑框中的文本:

    e = self.lineEdit1.text().ascii()

接下来我们需要做的就是将文本增加到列表框中。列表框有一个方法insertItem(),它接受一个字符串,并将其添加到列表:

    self.listBox1.insertItem(e)

最后,我们用clear()方法清除编辑框:

    self.lineEdit1.clear()


快完成了!我们需要做的最后一件事就是关闭删除按钮的autoDefault设置。(设置按钮为默认,意味当用户在对话框中按回车时,相当于单击该按钮。回车键增加文本到列表框,然后自动触发删除按钮,清除列表框,对我们没有任何意思。)autoDefault属性默认为True,因此我们需要在该按钮的Property Editor窗口将它设置为False。点击该按钮,察看右下角的Property窗口。
教程:使用QT建立Python GUI应用程序_第9张图片
终于,我们完成了Qt designer,保存您的所有工作。
现在打开一个shell,我们要将GUI代码编译成Python代码。通过pyuic编译器来做这件事。传递.ui文件作为参数,它输出Python代码到标准输出。(所以它更有助于将输出重定向到另一个文件。)

pyuic form1.ui > form1.py

最终得到form1.py,这是一个包含你的对话框的Python类模块。因为它没有main()函数,您不能直接运行。因此,我们需要为它创建一个简单的包装,像这样:
from qt import *
from form1 import *
import sys
if __name__ == "__main__":
    app = QApplication(sys.argv)
    f = Form1()
    f.show()
    app.setMainWidget(f)
    app.exec_loop()

不用考虑太多细节,我们导入Qt库的Python模块,同样也导入我们的对话框类。然后,为我们的Qt应用程序建立一个环境,实例化对话框,把它显示在屏幕上,设置它为应用程序主部件,让QT进入事件循环,处理所有的signals,并调用我们的slots。把它们保存在一个单独的Python文件中,例如mygui.py。不用说,这种包装是相当通用的,可在你的大多数Python/Qt应用程序中重用。最后,我们准备好运行了!运行你的应用程序:

python mygui.py

它看起来应该是这个样子:

如果你在编辑框输入一些东西,然后按回车键,输入的内容应该会被添加到列表框中。如果点击X按钮,列表框应被清除。如果程序表现的不同,回去重读上面的步骤,你可能错过了一些东西。 :)
仅此而已。现在去创建些更有趣的东西!只是你可能想知道所有这些部件和他们所有的方法。如何知道谁做什么?最简单的方法是通过QT Classes Reference去找,(或Main QT Reference page),它描述了所有的QT类(包括所有的部件)及其方法和属性。例子用的是C++,但他们能够很好地转化成的Python。所有的名称是相同的-只是将C++语法替换成Python,一路走好!

该项目使用的文件

form1.ui
form1.ui.h
mygui.py

作为练习,添加一些Python代码,退出程序时把列表框的内容保存到文件中,然后在启动时从文件中读入数据。

祝你好运,玩得开心,希望我的教程能对你有所帮助。

你可能感兴趣的:(Python)