2009/10/10教程:使用QT建立PythonGUI应用程序作者:AlexFedosov翻译:单手拍掌欢迎转载。转载时请保持版权信息的完整性译者注:本教程使用的是QT3。QT的最新版本为4.5。Python是一种有着许多令人惊叹的特性的伟大语言,但其默认的GUI包(TkInter)相当难看。另外,谁愿意手工输入所有GUI代码呢?做为替代,一个更好的建立PythonGUI程序的方法,就是使用Trolltech的QtDesigner,用所见即所得的方式创建漂亮的界面,然后用pyuic自动生成所需的代码(这是一个PyQT包所带的QT界面编译器。)QtDesigner也使得在项目中添加Python代码变得非常容易。(如果想您的应用程序做有用的事的,你需要编写一些代码。:))下面是一个如何使用Python和QT建立你的第一个程序的简短教程。我们将创建一个小小的应用程序,接受用户输入,然后将输入内容添加到一个列表中,此外允许用户清除列表中的内容。首先,需要安装以下软件包:Python的2.XPyQt的3.XQtDesigner3.X我采用FedoraCore1的默认安装,没有任何问题。我还测试了RedHat9,也没有任何问题。情况因人而异。(注:RedHat8.0版也应该可以工作,但它的Qtdesigner是旧版本,没有RH9和FC1的好用。)如果一切就绪,就让我们开始吧。启动QTdesigner。在RedHat9和FedoraCore1,它位于在Programming-MoreProgramming菜单。QTDesigner将会出现。就像这样:在New-Open对话框,单击Dialog,并点击OK。QTDesigner会创建一个新的dialogcanvas,并命名为Form1。在左侧工具栏选择LineEdit工具并在canvas上创建一个编辑框。命名为lineEdit1。这将是获取用户输入的地方。现在,在左侧工具栏选择ListBox工具,并在canvas上建立一个列表框。命名为listBox1。这将是我们存储用户输入的地方请注意,列表框中已经有一个项目。我们并不需要它,让我们来清掉它。双击列表框。弹出一个显示列表框中内容的对话框。点击DeleteItem删除这个项目。然后单击OK。现在,在左边工具栏选择PushButton工具并在canvas创建一个按钮。命名为pushButton1双击该按钮,出现一个允许你修改按钮上显示文字的对话框。重新命名为X,然后单击OK。现在,我们来让按钮做一些事情。在Qt中的术语,按钮将发送一个signal,被slot接收。(slot就像一个对象的方法,作为事件的回应被调用,例如用户单击按钮。)请记住,当用户点击这个按钮的时候,我们要清除列表框。已经有内置的方法做到这一点,因此我们直接使用它。使用连接工具将一个signal连接到一个slot,该工具位于顶部工具栏的右侧,一个绿色方块上的红色箭头。就像这样:下面是比较难的部分。选择了这个工具以后,点选X按钮并拖到列表框上。一旦拖到列表框上(列表框会加亮),你会看到一条从按钮到列表框的线,然后放开鼠标。另一个对话框会弹出,您可以在此明确的指定哪一对signal和slot连接。选择pushButton1作为发送者,signal为clicked(),listBox1为接收者,clear()作为slot。然后单击OK。(这意味着当用户点击按钮时将删除列表框中的所有内容。)在上一步中,我们使用一个内置slot来完成工作。现在,我们来创建自己的slot:当用户输入内容按下回车键后,它会将编辑框的内容添加到列表框中。要创建一个新的slot(记住,它就是一个方法),从Edit菜单中选择Slots。将显示一个自定义slots的对话框。开始时是空的。单击NewFunction添加新的slot。将该功能命名为AddEntry()(不要忘了新名称中的括号),因为它在列表框中增加新的项目。不要更改任何其他设置,只需点击OK。(我们将在后面编写此方法的代码。)现在,我们有一个slot,我们可以将其他东西连接到它。回想一下,当用户输入一些内容按下回车键后,我们将增加一个项目到列表中。选择我们的好朋友--连接工具,连接编辑框到列表框。连接对话框将会再次弹出。这一次选择lineEdit1作为发送者,returnPressed()作为signal,Form1作为接收者,我们自己的AddEntry()作为slot。最后,我们准备编写一些代码,来实现我们的AddEntry()方法。在ProjectOverview的右上角,双击窗口的form1.ui.h文件。(第二个,在你的主文件之后。)弹出一个显示这个文件文本的窗口。此文件就是你实现所有的自定义slots的地方,将会在编译过程中被包含进去。请注意,Qtdesigner已经将我们的AddEntry()函数放在了头文件中...不过是C++格式!不需要为此担心,我们仍然可以在大括号中使用Python代码,并且工作得很好。(Python的UI编译器足够聪明,完全可以理解QtDesigner生成的头文件。)唯一的问题是,Qtdesigner自动缩进代码,并且预期一行的末尾有分号,这自然会让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()快完成了!我们需要做的最后一件事就是关闭删除按钮的autoDefault设置。(设置按钮为默认,意味当用户在对话框中按回车时,相当于单击该按钮。回车键增加文本到列表框,然后自动触发删除按钮,清除列表框,对我们没有任何意思。)autoDefault属性默认为True,因此我们需要在该按钮的PropertyEditor窗口将它设置为False。点击该按钮,察看右下角的Property窗口。终于,我们完成了Qtdesigner,保存您的所有工作。现在打开一个shell,我们要将GUI代码编译成Python代码。通过pyuic编译器来做这件事。传递.ui文件作为参数,它输出Python代码到标准输出。(所以它更有助于将输出重定向到另一个文件。)pyuicform1.uiform1.py最终得到form1.py,这是一个包含你的对话框的Python类模块。因为它没有main()函数,您不能直接运行。因此,我们需要为它创建一个简单的包装,像这样:fromqtimport*fromform1import*importsysif__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应用程序中重用。最后,我们准备好运行了!运行你的应用程序:pythonmygui.py它看起来应该是这个样子:如果你在编辑框输入一些东西,然后按回车键,输入的内容应该会被添加到列表框中。如果点击X按钮,列表框应被清除。如果程序表现的不同,回去重读上面的步骤,你可能错过了一些东西。:)仅此而已。现在去创建些更有趣的东西!只是你可能想知道所有这些部件和他们所有的方法。如何知道谁做什么?最简单的方法是通过QTClassesReference去找,(或MainQTReferencepage),它描述了所有的QT类(包括所有的部件)及其方法和属性。例子用的是C++,但他们能够很好地转化成的Python。所有的名称是相同的-只是将C++语法替换成Python,一路走好!该项目使用的文件form1.uiform1.ui.hmygui.py作为练习,添加一些Python代码,退出程序时把列表框的内容保存到文件中,然后在启动时从文件中读入数据。祝你好运,玩得开心,希望我的教程能对你有所帮助。