本文介绍的是在QT中建立Python GUI应用程序,图文并茂,相信你很喜欢这篇有趣的文章,提醒一下:这是在linux环境下运行的。
注:本教程使用的是QT 3。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将会出现。就像这样:
在New->Open对话框,单击Dialog,并点击OK。
#p#
QT Designer会创建一个新的dialog canvas,并命名为Form1 。
在左侧工具栏选择LineEdit工具并在canvas上创建一个编辑框。命名为lineEdit1。这将是获取用户输入的地方。
现在,在左侧工具栏选择ListBox工具,并在canvas上建立一个列表框。命名为listBox1 。这将是我们存储用户输入的地方
请注意,列表框中已经有一个项目。我们并不需要它,让我们来清掉它。双击列表框。弹出一个显示列表框中内容的对话框。点击Delete Item删除这个项目。然后单击OK。
现在,在左边工具栏选择PushButton工具并在canvas创建一个按钮。命名为pushButton1
#p#
双击该按钮,出现一个允许你修改按钮上显示文字的对话框。重新命名为X,然后单击OK。
现在,我们来让按钮做一些事情。在Qt中的术语,按钮将发送一个signal,被slot接收。(slot就像一个对象的方法,作为事件的回应被调用,例如用户单击按钮。)请记住,当用户点击这个按钮的时候,我们要清除列表框。已经有内置的方法做到这一点,因此我们直接使用它。使用连接工具将一个signal连接到一个slot,该工具位于顶部工具栏的右侧,一个绿色方块上的红色箭头。就像这样:
下面是比较难的部分。选择了这个工具以后,点选X按钮并拖到列表框上。一旦拖到列表框上(列表框会加亮),你会看到一条从按钮到列表框的线,然后放开鼠标。另一个对话框会弹出,您可以在此明确的指定哪一对signal和slot连接。选择pushButton1作为发送者, signal为clicked(),listBox1为接收者,clear()作为slot。然后单击OK。(这意味着当用户点击按钮时将删除列表框中的所有内容。)
在上一步中,我们使用一个内置slot来完成工作。现在,我们来创建自己的slot:当用户输入内容按下回车键后,它会将编辑框的内容添加到列表框中。要创建一个新的slot(记住,它就是一个方法),从Edit菜单中选择Slots 。
将显示一个自定义slots的对话框。开始时是空的。单击New Function添加新的slot。将该功能命名为AddEntry()(不要忘了新名称中的括号),因为它在列表框中增加新的项目。不要更改任何其他设置,只需点击OK。(我们将在后面编写此方法的代码。)
现在,我们有一个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)编辑此文件。(或者找出如何关闭自动缩进。)
那么,我们要写些什么代码呢?我们必须完成三件事:
从编辑框获取文字
将文字插入到列表框
清除编辑框
你定义的所有slots都是对话框的方法,它的所有部件都是对象,你可以看一下他们的名字。因此self.lineEdit1是编辑框,self.listBox1是列表框。编辑框有一个方法叫做text(),它返回一个包含编辑框中内容的QString对象。不需要知道这些对象太多的细节,只需要知道QString对象有一个ascii()方法,它将返回所输入文本的原始ASCII。因此,要获得编辑框中的文本:
- e = self.lineEdit1.text().ascii()
接下来我们需要做的就是将文本增加到列表框中。列表框有一个方法insertItem(),它接受一个字符串,并将其添加到列表:
- self.listBox1.insertItem(e)
最后,我们用clear()方法清除编辑框:
- self.lineEdit1.clear()
#p#
快完成了!我们需要做的最后一件事就是关闭删除按钮的autoDefault设置。(设置按钮为默认,意味当用户在对话框中按回车时,相当于单击该按钮。回车键增加文本到列表框,然后自动触发删除按钮,清除列表框,对我们没有任何意思。)autoDefault属性默认为True,因此我们需要在该按钮的Property Editor窗口将它设置为False。点击该按钮,察看右下角的Property窗口。
终于,我们完成了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,一路走好!
该项目使用的文件
作为练习,添加一些Python代码,退出程序时把列表框的内容保存到文件中,然后在启动时从文件中读入数据。
小结:QT中建立Python GUI应用程序的内容介绍到这,本文章大多是操作,并且图文并茂,希望真的可以帮助你解决问题。谢谢留言。
【编辑推荐】