PyQt4入门学习笔记(一)

PyQt4入门学习笔记(一)

一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留之后再复习。python

原始连接以下:web

http://zetcode.com/gui/pyqt4/firstprograms/shell

在这篇PyQt4的入门文档,咱们讲学习一些基础功能。编程

简单的例子

这是一个显示一个小窗口的简单例子。咱们能够对这个窗口作一些操做。咱们能够改变它的大小,最大化它,或者最小化它。这须要大量的编码。有人已经写好了这些基础函数,由于它在绝大部分应用中重复出现,不须要重复的去编码。PyQt4是一个高级的工具包。若是咱们在一个低级的工具包里编码,下面这个例子可能轻松过百行。app

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

"""
ZetCode PyQt4 tutorial 

In this example, we create a simple
window in PyQt4.

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

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()

上面这段代码运行后将在屏幕上显示一个小窗口。编辑器

import sys
from PyQt4 import QtGui

咱们在这里提供必要的import,基础的GUI窗口部件在QtGui模块里。函数

app = QtGui.QApplication(sys.argv)

每个PyQt4的应用必须建立一个Application对象。参数sys.argv是一个来自命令行的参数列表。python脚本能够从shell脚本里运行。这是一种咱们能够控制咱们脚本启动的方式。工具

w = QtGui.QWidget()

QtGui.Qwidgt部件是一个是pyqt4里全部用户接口对象中的基类。咱们用默认的QtGui.Qwidgt构造器(constructor)。默认的构造器没有父类,一个不带父类的窗口部件在窗口被调用。学习

w.resize(250, 150)

这个resize()方法改变窗口大小。上述语句把窗口改为了250px宽,150px高。测试

w.move(300, 300)

这个move()方法移动窗口到屏幕上坐标为x,y=(300,300)的位置

w.setWindowTitle('Simple')

上述语句使咱们为咱们的窗口设置标题,标题会被显示在标题栏(titlebar)

w.show()

这个show()方法把窗口部件显示在屏幕上。一个窗口是先在内存中建立,而后再在屏幕上显示。

sys.exit(app.exec_())

最终,咱们结束了应用的主循环。主循环是从窗口系统中接收事件并快速的发往应用窗口。当咱们调用exit()方法或者关闭主窗口时,主循环结束。这个sys.exit()方法是确保一个干净的关闭。

这个exec_()方法有个下划线,由于exec是python的一个关键字,因此用exec_替代了。

若是你按照上面的代码运行,那么应该会获得相似下面这样的状态(我本身修改了窗口的大小,由于surfacebook的高分辨率几乎让我看不到原来的标题,但样式大体不会变)

image1

应用图标

应用图标(application icon)是一个被用来显示在标题栏顶部左侧角落的小图片。在下面这个例子中,咱们将展现如何在pyqt4里面实现它。咱们同时也会介绍一些新方法。
#!/usr/bin/python
# -- coding: utf-8 --

"""
ZetCode PyQt4 tutorial 

This example shows an icon
in the titlebar of the window.

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QtGui.QIcon('web.png'))        
    
        self.show()
        
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

咱们前一个例子是用面向过程的风格编程。python是一门既支持面向过程又支持面向对象的语言。在pyqt4内编程,意味着OOP(面向对象)。

class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        ...

面向对象中三个最重要的事是类(class),数据(data),和方法(method)。在这里咱们建立了一个叫作Example的新类。这个Example类是继承于QtGui.QWidget,这意味着咱们能够调用两个构造器,第一个是对Example类,另外一个是对被继承的类。
super()方法返回Example类的父类对象。__init__()方法是python的一个构造器方法。

self.initUI()

GUI的建立是被委托给initUI()方法。

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Icon')
self.setWindowIcon(QtGui.QIcon('web.png'))

这三个方法都是从QtGui.QWidget类继承过来。

setGeometry()方法作两个事。它定位了窗口在屏幕的位置而且设定窗口大小。前两个参数是窗口的x,y坐标。第三个参数是窗口宽度,第四个是窗口高度。事实上,它结合了resize()move()方法。最后一个方法设定了应用的图标。为了作到这个,咱们建立了一个QtGui.QIcon类型的对象。QtGui.QIcon接受一个图片的路径(就是你想用来作图标的图片)

def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

启动代码被放在一个main()方法内(我想这叫函数更好?)。这是一个python 的习惯用法。

运行后相似下图
image2

展现一个提示工具

咱们能够给咱们的任何一个部件提供一个气泡提示。

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

"""
ZetCode PyQt4 tutorial 

This example shows a tooltip on 
a window and a button

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
    def initUI(self):
        
        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
        
        self.setToolTip('This is a <b>QWidget</b> widget')
        
        btn = QtGui.QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)       
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Tooltips')    
        self.show()
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

在这个例子里,咱们为两个pyqt4部件显示了一个提示工具。

QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))

这个基础的方法设定一个被用来渲染提示工具的字体。咱们用了一个10px的SansSerif字体。

self.setToolTip('This is a <b>QWidget</b> widget')

为了建立一个提示工具,咱们调用setTooltip()方法。咱们同时可使用富文本。

btn = QtGui.QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

咱们建立了一个按钮(button),而且为其设定一个提示工具。

btn.resize(btn.sizeHint())
btn.move(50, 50)

这个按钮在窗口上被改变大小而且被移动。这个sizeHint()方法提供了一个按钮的推荐尺寸。

运行上面的程序后,效果相似下图

image3

关闭窗口

咱们以前关闭窗口的方法是点击标题栏的"x"。在下一个例子里,咱们将会展现咱们能够程序化的关闭咱们的窗口。咱们将会稍稍的接触一下信号(signal)和槽(slot)。

下面是一个咱们将会用在咱们例子中的QtGui.QPushButton的构造器。

QPushButton(string text, QWidget parent = None)

text参数是一个被用来展现在按钮上的字符串。parent是一个咱们按钮的父类部件,在咱们的例子里,它将会是QtGui.QWidget

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

"""
ZetCode PyQt4 tutorial 

This program creates a quit
button. When we press the button,
the application terminates. 

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
    def initUI(self):               
        
        qbtn = QtGui.QPushButton('Quit', self)
        qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(50, 50)       
        
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Quit button')    
        self.show()
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

在这个例子里,咱们建立了一个离开按钮。点击按钮,应用将会被终止

运行后效果相似下图

image4

消息盒子

默认的,若是咱们点击了标题栏的"X",QtGui.QWidget将会被关闭。有些时候咱们想要修改这个默认的行为。举个例子,若是咱们有一个文件在一个编辑器内被打开,而且作了些修改,退出时咱们会显示一个消息盒子让人肯定这个动做。

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

"""
ZetCode PyQt4 tutorial 

This program shows a confirmation 
message box when we click on the close
button of the application window. 

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
        
    def initUI(self):               
        
        self.setGeometry(300, 300, 250, 150)        
        self.setWindowTitle('Message box')    
        self.show()
        
        
    def closeEvent(self, event):
        
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes | 
            QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()        
        
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

若是咱们关闭QtGui.QWidgetQtGui.QCloseEvent将会被触发。为了修改部件行为咱们须要从新实现closeEvent事件handler。

reply = QtGui.QMessageBox.question(self, 'Message',
    "Are you sure to quit?", QtGui.QMessageBox.Yes | 
    QtGui.QMessageBox.No, QtGui.QMessageBox.No)

咱们展现了一个带有两个按钮的消息盒子:yes和no,第二个字符串是对话框显示的字符串。第三个参数具体规定了按钮和显示文字的组合。最后一个参数是默认的按钮。它是一个初始化的键盘focus的按钮。(就是直接enter时选择的按钮)。返回值被存储在reply变量中。

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

咱们测试了返回值。若是点击了yes按钮,咱们接受一个关闭部件的时间而且关闭应用。其余状况咱们关闭这个事件。

运行后相似下图:

image5

将窗口置于屏幕中间

下面的脚本显示咱们如何在桌面屏幕上中心化一个窗口

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

"""
ZetCode PyQt4 tutorial 

This program centers a window 
on the screen. 

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
from PyQt4 import QtGui


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
    def initUI(self):               
        
        self.resize(250, 150)
        self.center()
        
        self.setWindowTitle('Center')    
        self.show()
        
    def center(self):
        
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        
        
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

QtGui.QDesktopWidget类提供了关于用户桌面的信息,包括屏幕尺寸

self.center()

这行代码将会将窗口置于屏幕中心

qr = self.frameGeometry()

咱们在主窗口内获得一个指定的长方形几何体。

cp = QtGui.QDesktopWidget().availableGeometry().center()

咱们获得了显示器的中心点。

qr.moveCenter(cp)

咱们的长方形窗口已经有了宽度和高度,如今咱们设定它的中心在屏幕中心。它的大小不变。

self.move(qr.topLeft())

咱们移动应用窗口的左上点到长方形的左上角,至此咱们就将窗口移动到了中央。

在这一节pyqt4的教程中,咱们讨论了一些基本的内容。

翻译和补充的有误的地方,欢迎在评论区指正。

相关文章
相关标签/搜索