简单易懂的PyQt Demo

PyQtDemo.tar.gz

其实是专门为右京样一兄所作,搞了一个非常简单的窗口。闲话少说,我们来看看这个东西。

内容物很简单。

.
├── build.py
├── demowindow.py
├── main.pyw
└── ui
└── demowindow.ui

首先需要运行./build.py根据ui文件生成一个py文件,然后./main.pyw就可以运行了。内容也超少,首先是main.pyw的内容:

#!/usr/bin/env python

import sys
from PyQt4.QtGui import QApplication
from demowindow import DemoWindow
from PyQt4.QtCore import Qt, SIGNAL

if __name__ == "__main__":
    app = QApplication(sys.argv);
    app.connect( app, SIGNAL( "lastWindowClosed()" ), app.quit);
    demowindow = DemoWindow()
    demowindow.show()
    sys.exit(app.exec_())

原理很简单,实例化一个QApplication对象(Qt程序都需要),设置一个signal,表示所有窗口退出后程序退出。

然后实例化了一个我们用Qt Designer创建的窗口,并显示。

然后是demowindow.py的内容:

from PyQt4.QtCore import Qt, SIGNAL
from PyQt4.QtGui import *

from ui_demowindow import Ui_DemoWindow

class DemoWindow(QWidget, Ui_DemoWindow):
    def __init__(self, parent = None):
        QWidget.__init__(self,parent)
        self.setupUi(self)
        self.connect(self.testButton, SIGNAL("clicked()"), self.test)
        self.connect(self.exitButton, SIGNAL("clicked()"), self.exit)

    def test(self):
        self.helloLabel.setText("abc");

    def exit(self):
        self.close()

内容依旧简单明了,主要就是处理按钮事件,按下Test就会把显示的文字改成abc,按下Exit就是退出。初始化函数的惯例就是需要调用setupUi,这个函数相当于处理了界面的构建。那么原理是什么样子的呢?首先我们创建了一个ui文件(利用qt designer,涂涂画画什么的,最简单了,layout得自己玩玩才搞得明白)。然后利用pyuic4这个程序将ui文件转换为python代码pyuic4 -o ui_demowindow.py ui/demowindow.ui,这里这个python文件中会定义一个类Ui_classname,这个class name就是ui文件中顶级widget的名字(区分大小写)。然后一般都是利用定义一个新类继承Ui_类,和对应的Widget类型。然后在初始化的时候调用setupUi(self)初始化界面。

然后解释一下Qt的消息处理机制(个人理解),Qt的消息分为SLOT和SIGNAL,关联SIGNAL和SLOT称为connect。SIGNAL相当于一个事件,例如

self.connect(self.testButton, SIGNAL("clicked()"), self.test)

这是什么意思呢?就是在self.testButton这个按钮产生clicked的SIGNAL时,调用test这个函数。connect就是将这个信号和SLOT(test)关联起来。

P.S. 吐槽:右京样一兄你的blog没有trackback吗?还是你的主题不支持trackback链接……我本来想trackback一下你的原始文呢。

P.S.的P.S. 我猜出trackback链接了……

参考资料:

http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html

http://diotavelli.net/PyQtWiki/Creating_GUI_Applications_with_PyQt_and_Qt_Designer

This entry was posted in Qt and tagged . Bookmark the permalink.

9 Responses to 简单易懂的PyQt Demo

  1. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    哇……一上来就见到宝了……
    真是十分感谢照顾啊,看来足下的Python水平应该已经比我强了……

    话说我今天还真的去下PyQt了,不过速度是令人惊讶的1kbps,下完整个程序需要5个小时……后来我觉得说不定是GFW的问题,于是破网去下,结果下到一半断掉……一会再去试试。

    P.S. 我的网志应该是支持引用的啊?一会去看看。

  2. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    嗯……通读完了,我表示不懂……
    以前没接触过图形化的东西(VB除外……),看来还是得从PyQt官方文档看起。

  3. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    呃……今天过来仔细看了看,有点明白了。果然要对面向对象有很深的理解才可以搞这个……
    到目前为止Class对我来说都是浮云的说……从来不用那玩意……

  4. csslayer says:
    Firefox 3.6.8 GNU/Linux

    其实人家都说面向对象是最符合人类思维的设计呢……

  5. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    真的么……我到现在都还搞不明白类里面嵌入对象(或方法)和函数里面嵌入函数究竟有多大区别呢……
    而且我最早学的时候一直搞不懂Class里面的self和初始化到底是啥意思。后来忙于自己的主业,Python搁置了很长一段,直到前一阵子捡起来才看明白它们的作用。

    引用某高人的话:“面向对象编程,是现在比较流行的编程方式,是个人都得用‘面像对象’的思路来编程,来显得自己跟得上形式。其实面对对象并不是必须的,光棍并不可耻。”……

    另外我估计PyQt这玩意我得学一阵子,所以采纳您的清屏建议了……

  6. csslayer says:
    Firefox 3.6.8 GNU/Linux

    我表示fcitx就没有啥面向对象的东西,嗯

    self就是自己嘛,比如说我建立一个人的对象叫,右京样一 (= =b)
    你有个函数叫吃饭,你吃了饭胃容量就-1。胃容量是你的一个属性

    那怎么写吃饭这个函数呢:
    吃饭()
    {
    self.胃容量 -= 1;
    }
    self就是引用当前调用这个函数的对象用的。比如另外一个对象我,我吃饭的时候self就变成我,就这么回事。

    面向对象有的时候还是不错的。面对实际对象的时候,设计上不至于东一块西一块。

  7. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    那个啥……我上面说现在已经看懂了的说……不过还是很感谢。
    我在想未来是不是要把我那程序的N个字典变成Class,再把Class写入到存档里面。

    顺带一提,今天我在Arch虚拟机里面终于见到图形界面了。结果好不容易鼓起勇气真机装的时候分区那步选sda就出错:
    FATAL ERROR: Bad primary partition 3 :
    Partition ends in the final partial cylinder.
    Press any key to exit cfdisk.

    我是用优盘装的,打开优盘本身(sdb)就一切正常……
    难道是因为我IdeaPad Y460有个联想的隐藏分区的关系?

  8. csslayer says:
    Firefox 3.6.8 GNU/Linux

    我不知道你下载的是哪个版本的arch安装盘

    不过有个版本的cfdisk有问题,我也不知道为什么

    建议是先学习一下fdisk,安装时ctrl alt fn到终端用fdisk分区,跳过分区这个步骤直接选择挂载的分区

  9. 右京样一 says:
    Google Chrome 5.0.375.99 Windows 7

    呃……隐藏分区里有个引导文件,干掉之后就解决了……
    不过不会配置网卡,DSL上网失败中……

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.