代码改变世界

Pyqt4学习笔记-简单案例

2016-02-03 16:35  影澜  阅读(5343)  评论(0编辑  收藏  举报

官方文档:http://zetcode.com/gui/pyqt4/

中文文档:http://www.qaulau.com/books/PyQt4_Tutorial/index.html

QtCore:核心的非GUI功能,对时间、文件、目录、各种数据类型、流、网址、媒体类型、线程或进程进行处理

QtGui:图形化窗口组件和及相关类。包括如按钮、窗体、状态栏、滑块、位图、颜色、字体等等

QtHelp:包含了用于创建和查看可查找的文档的类

QtNetwork:包括网络编程的类。用来编写TCP/IP和UDP的客户端和服务器

QtOpenGL:使用OpenGL库来渲染3D和2D图形

QtScript:包含了使PyQt应用程序使用JavaScript解释器编写脚本的类

QtSql:提供操作数据库的类

QtSvg:提供了显示SVG文件内容的类。可缩放矢量图形(SVG)

QtTest:包含了对PyQt应用程序进行单元测试的功能

QtWebKit:实现了基于开源浏览器引擎WebKit的浏览器引擎

QtXml:处理XML文件的类,该模块提供了SAX和DOM API的接口

QtXmlPatterns:包含的类实现了对XML和自定义数据模型的XQuery和XPath的支持

phonon:包含的类实现了跨平台的多媒体框架,可以在PyQt应用程序中使用音频和视频内容

QtMultimedia:提供了低级的多媒体功能,通常更多使用 phonon 模块

QtAssistant:包含的类允许集成 Qt Assistant 到PyQt应用程序中,提供在线帮助。

QtDesigner:包含的类允许使用PyQt扩展 Qt Designer 。

Qt:综合了上面描述的模块中的类到一个单一的模块中。

这样做的好处是你不用担心哪个模块包含哪个特定的类,坏处是加载进了整个Qt框架,从而增加了应用程序的内存占用。

uic:包含的类用来处理.ui文件,该文件由Qt Designer创建,用于描述整个或者部分用户界面。

它包含的加载.ui文件和直接渲染以及从.ui文件生成Python代码为以后执行的类。

先记录简单的,以下代码可显示一个基本的window: 

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


def main():

    app = QtGui.QApplication(sys.argv)

    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

from PyQt4 import QtGui,基本的GUI组件都存放在QtGui这个模块

app = QtGui.QApplication(sys.argv),
每个Pyqt的程序都必须创建一个application对象,application在 QtGui 模块中,sys.argv 参数是命令行中的一组参数。

w = QtGui.QWidget(),创建窗口对象,QWidget窗口组件是PyQt4中所有用户界面对象的基类,这里直接使用QWidget默认的构造。

app.exec_()其实就是QApplication的方法,原来这个exec_()方法的作用是“进入程序的主循环直到exit()被调用”,如果没有这个方法,运行的时候窗口会闪退,所以show是有发挥作用的,但没有使用exec_(),所以没有进入程序的主循环就直接结束了。于是修改代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


def main():

    app = QtGui.QApplication(sys.argv)

    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    app.exec_()


if __name__ == '__main__':
    main()

不用sys.exit(app.exec_()),只使用app.exec_(),程序一样可以正常运行,但是关闭窗口后进程却不会退出,尝试print输出app.exec_()的结果,返回0,于是再做修改:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


def main():

    app = QtGui.QApplication(sys.argv)

    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    
    app.exec_()
    sys.exit(0)

if __name__ == '__main__':
    main()
这样的话,运行时打开窗口也正常,退出时进程也可以结束了。所以才可以这么用sys.exit(app.exec_())。
增加图标:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


class Icon(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        # 设置初始位置
        self.setWindowTitle('Icon')
        # window标题
        self.setWindowIcon(QtGui.QIcon('icons/web.png'))
        # 图标文件位置

app = QtGui.QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())

  图标显示效果
移动到视窗范围内触发提示信息:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


class Tooltip(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Tooltip')

        self.setToolTip('This is a <b>QWidget</b> widget')
        # 设置提示信息
        QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish', 10))
        # 显示字体,在MAC下无效

app = QtGui.QApplication(sys.argv)
tooltip = Tooltip()
tooltip.show()
sys.exit(app.exec_())

  提示效果
退出时弹出确认消息框:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui


class MessageBox(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('message box')

    def closeEvent(self, event):

        # 关闭窗口的事件触发消息框询问,并设置消息框标题,提示信息,选择按键
        reply = QtGui.QMessageBox.question(self, 'Message',
                                           "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

app = QtGui.QApplication(sys.argv)
qb = MessageBox()
qb.show()
sys.exit(app.exec_())

  提示效果

设置窗口居中显示:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui

class Center(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('center')
        self.resize(250, 150)
        # 重新设置大小
        self.center()

    def center(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        # 获取屏幕分辨率
        size =  self.geometry()
        # 获取组件大小
        self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)


app = QtGui.QApplication(sys.argv)
qb = Center()
qb.show()
sys.exit(app.exec_())

 文档中简单的使用范例,添加注释后做个记录