文档章节

PyQt5教程(一)——第一个PyQt5程序

pseudo
 pseudo
发布于 2015/11/26 17:03
字数 2456
阅读 6120
收藏 19

原文: http://zetcode.com/gui/pyqt5/firstprograms/

在这部分教程中我们将学习PyQt5的一些基本功能

一个简单的例子

这是一个只显示一个小窗口的简单示例。但我们可以对这个窗口进行一些操作,如调整尺寸,最大化或最小化。这需要编写很多代码,但有人已经完成了这个功能。因为它在多种程序中的通用性,所以不再需要重复编码。PyQt5是一个高级工具集。如果我们使用较低级的工具集进行编码,要实现这个功能最少也要上百行代码。

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

"""
ZetCode PyQt5 tutorial 

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

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
    
    app = QApplication(sys.argv)

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

上面的代码会在屏幕上显示一个小窗体。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

在这里我们导入了必要的模块。这些基本控件位于PyQt5.QtWidgets模块中。

app = QApplication(sys.argv)

每个PyQt5应用程序都需要创建一个application对象。sys.argv是从命令行传入的参数列表。Python脚本可以从shell中运行。这是一种控制脚本启动的方式。

w = QWidget()

控件QWidget是QtPy5中所有UI对象的基类。我们调用了QWidget的默认构造器。默认构造器没有parent参数。没有parent的控件称为窗体(window)。

w.resize(250, 150)

resize()方法用于设置控件的尺寸。它宽250px高150px。

w.move(300, 300)

move()方法将控件移动到坐标为x=300, y=300的位置

w.setWindowTitle('Simple')

这里设置了窗体的标题。标题在标题栏中显示。

w.show()

show()方法将控件显示在屏幕上。控件要先在内存中创建,然后在屏幕上显示。

sys.exit(app.exec_())

最后我们进入了application的主循环。事件处理从这里开始。主循环从窗体系统中接收事件,并将事件分发给控件。在调用exit()方法或主控件销毁时主循环会停止。sys.exit()方法确保可以干净地退出。系统可以感知到程序是如何退出的。

注意exec_()方法的下划线。由于exec是python中的关键字,所以使用exec_()。

Simple

图标

程序的图标是显示在标题栏左上角的一个小图像。接下来我们将介绍如何用PyQt5实现,这会用到一些新的API。

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

"""
ZetCode PyQt5 tutorial 

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

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))        
    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())  

之前的示例采用了过程式编码风格。Python语言支持过程式与面向对象的编程风格。PyQt5采用了面向对象编程。

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

在面向对象编程中有三个要素:类,数据与方法。我们创建了一个Example类,它继承自QWidget。这就意味着我们要调用两个构造器:首先是Example类的,然后是被继承的类的。super()方法返回了Example的父对象,并且我们调用了它的构造器。__init__()方法是Python语言中的构造器。

self.initUI()

GUI的创建交给了initUI()方法。

self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  

这三个方法继承自QWidget类。setGeometry()设置了控件的位置与尺寸。前两个参数是窗体的x,y坐标,第三个与第四个参数设置了窗体的宽度与高度。实际上它合并了resize()move()方法。最后一个方法设置了应用的图标。我们需要创建一个QIcon对象,QIcon接受要显示的图标的路径作为参数。

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())  

在这里创建了application与example对象,并且启动了主循环。

Icon

tooltip(提示框)的显示

我们可以为所有控件添加消息提示框。

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

"""
ZetCode PyQt5 tutorial 

This example shows a tooltip on 
a window and a button.

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, 
    QPushButton, QApplication)
from PyQt5.QtGui import QFont    


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

在这个例子中我们为两个PyQt5控件添加了提示消息。

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

这个静态方法为tooltip设置了10px的Sanserif字体。

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

我们调用setToolTip()方法为控件创建提示消息。消息可以使用富文本格式。

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

这里我们创建了一个PushButton并为它设置了一个富文本提示消息。

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

这里设置了button的尺寸,并将其在窗体上移动。sizeHint()方法为控件返回一个推荐的尺寸。

Tooltips

窗体的关闭

关闭窗体最明显的方法是点击标题栏上的x符号。在下面的例子中,我会展示如何通过编程来关闭窗体。这里我们要涉及到简单的signal和slot(信号槽)。

QPushButton(string text, QWidget parent = None)

这是之前用到的QPushButton控件的构造器。其中text参数是将要在按钮上显示的文本,parent表示按钮的父控件,在这个例子中就是QWidget。一个程序的所有控件构成了一个控件树。在这个树上大部分控件都有父控件。没有父控件的控件是顶层窗体。

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

"""
ZetCode PyQt5 tutorial 

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

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication


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

在这个示例中我们创建了一个退出按钮。程序会在点击了这个按钮时退出。

from PyQt5.QtCore import QCoreApplication

这里我们我用到QtCore模块中的一个对象。

qbtn = QPushButton('Quit', self)

我们创建了一个PushButton, 它是QPushButton类的实例。构造器的第一个参数是按钮的标签,第二个参数是它的父控件,也就是Example, 由于继承关系Example也是QWidget

qbtn.clicked.connect(QCoreApplication.instance().quit)

PyQt5中的事件处理系统采用signal&slot(信号槽)机制。当我们点击按钮时会发出clicked信号。slot可以是Qt slot或任何Python的callable对象。QCoreApplication包含了主事件循环;它可以处理并分发事件。instance()方法返回它的当前实例。QCoreApplication是由QApplication创建的。clicked信号连接到可以退出程序的quit()方法。这个过程由两个对象完成:发送者与接收者。发送者是PushButton,接收者是QApplication对象。

Quit button

MessageBox(对话框)

当我们点击标题栏上的x按钮时默认会关闭QWidget。但有时我们想改变这种默认行为。例如,如果我们在编辑器中打开了一个文件,并且对这个文件做了修改。在关闭前我们希望显示一个对话框让用户进行确认。

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

"""
ZetCode PyQt5 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: January 2015
"""

import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication


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

        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()        
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在关闭QWidget时会生成QCloseEvent。我们需要重新实现closeEvent()这个事件处理器来改变控件的行为。

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

我们要显示带有两个按钮(Yes和No)的消息对话框。第一个字符串会显示在标题栏,第二个字符串是对话框的消息文本。第三个参数设置了显示在对话框中的按钮。最后那个参数指定了默认的按钮,也就是默认取得键盘焦点的按钮。返回结果保存在reply变量中。

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

我们在这里对返回值进行匹配。当点击了Yes按钮时,我们会接受该事件,从而关闭该控件并退出程序;否则就忽略这个关闭事件。

Message Box

窗体居中

下面的脚本会将窗体置于桌面中心。

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

"""
ZetCode PyQt5 tutorial 

This program centers a window 
on the screen. 

author: Jan Bodnar
website: zetcode.com 
last edited: January 2015
"""

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication


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

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

self.center()

center()方法中包含了窗体居中的代码。

qr = self.frameGeometry()

得到一个指定了主窗体形状的矩形。

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

指出显示器的屏幕分辨率并根据分辨率找出屏幕的中心点。

qr.moveCenter(cp)

将矩形移动到屏幕中心,尺寸不变。

self.move(qr.toLeft())

将窗体的左上角移动到矩形qr的左上角,窗体与矩形重合,从而将窗体置于屏幕中心。

在这部分教程中我们学到了一些PyQt5基础

© 著作权归作者所有

pseudo

pseudo

粉丝 85
博文 37
码字总数 35469
作品 3
朝阳
程序员
私信 提问
加载中

评论(2)

f
fanlion
感谢楼主
r
redfortress
太好啦,正准备学pyqt5,感谢大大的无私奉献。希望能全部翻译出来,非常感谢!42
PyQt5教程(四)——事件与信号

原文:http://zetcode.com/gui/pyqt5/eventssignals/ 在这部分教程中我们将探讨在程序内部发生的事件与信号。 事件 所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方...

pseudo
2015/12/04
1K
0
PyQt5教程(五)——对话框

原文:http://zetcode.com/gui/pyqt5/dialogs/ 对话框或对话窗口是现代GUI程序不可或缺的一部分。对话的定义是两个或多个人之间的交谈。在计算机程序中对话是与程序进行“交谈”的窗体。对话...

pseudo
2015/12/06
767
0
PyQt5教程(二)——菜单与工具栏

原文:http://zetcode.com/gui/pyqt5/menustoolbars/ 我们将在这部分教程中创建菜单与工具栏。一个菜单就是位于菜单栏中的一组命令。应用的工具栏放置了带有按钮的常用命令。 主窗体 类提供了...

pseudo
2015/11/29
1K
0
pyinstaller打包注意事项

pyinstaller是可以加密的,目前是最好用的一个,通过对比py2exe,nutika等。 环境 3.6 命令行用法: pyinstaller.exe --key 1234567890123456 -F -w -i icon_filepath --paths=C:Python36Li...

guangzhao17
2018/08/15
0
0
PyQt5教程(三)——布局管理

原文:http://zetcode.com/gui/pyqt5/layout/ 布局管理是GUI编程中的重要部分。布局管理是如何将控件放置于窗体上的技术,它的实现有两种基本方式:绝对布局与layout类。 绝对布局 程序员要指...

pseudo
2015/12/01
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
47分钟前
1
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
57分钟前
4
0
java 序列化和反序列化

1. 概述 序列恢复为Java对象的过程。 对象的序列化主要有两 首先我们介绍下序列化和反序列化的概念: 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。...

edison_kwok
今天
2
0
分布式数据一致性

狼王黄师傅
今天
2
0
经验

相信每位开发者在自己开发的过程中,都会反思一些问题,比如怎样提高编程能力、如何保持心态不砍产品经理、996 之后怎样恢复精力……最近开发者 Tomasz Łakomy 将他 7 年的开发生涯中学习到...

WinkJie
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部