PyQt5初级教程--PyQt5的第一个程序[3/13]

想用PyQt5写GUI,但是网上的PyQt5资源太少了,找到一个英文的,翻译一下,和学习PyQt5的同学共勉!

(本系列中所有代码在windows7 64位[]/Python 3.4.3 32bit/PyQt GPL v5.5 for Python v3.4 (x32)/eric6-6.0.8下测试通过.)

原本地址:http://zetcode.com/gui/pyqt5/

================================================================================

第一个PyQt5程序

在这部分,我们学习一些基本功能.

简单的例子

这是一个简单的例子,它显示一个小窗口.我们可以对这个窗口做很多事情,我们可以调整它的大小,最大化它或最小化它.这需要很多代码.但是已经有人编写了这个功能.因为它在绝大多数的应用中重复出现,因此没有必要重复的编写它.PyQt5是高级工具集.如果我们把它当作一个低级工具集,那么下面的代码例子可能要有几百行.

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应用都必须创建一个应用对象.sys.argv参数是来自命令行的参数列表.Python脚本可以从shell里运行.这是我们如何控制我们的脚本运行的一种方法.


w = QWidget()
QWidget窗口是PyQt5中所有用户界口对象的基本类.我们使用了QWidget默认的构造器.默认的构造器没有父类.一个没有父类的窗口被称为一个window.

w.resize(250, 150)
resize()方法调整了窗口的大小.被调整为250像素宽和150像素高.

w.move(300, 300)
move()方法移动了窗口到屏幕坐标x=300, y=300的位置.

w.setWindowTitle('Simple')
在这里我们设置了窗口的标题.标题会被显示在标题栏上.

w.show()
show()方法将窗口显示在屏幕上.一个窗口是先在内存中被创建,然后显示在屏幕上的.

sys.exit(app.exec_())
最后,我们进入应用的主循环.事件处理从这里开始.主循环从窗口系统接收事件,分派它们到应用窗口.如果我们调用了exit()方法或者主窗口被销毁,则主循环结束.sys.exit()方法确保一个完整的退出.环境变量会被通知应用是如何结束的.

exec_()方法是有一个下划线的.这是因为exec在Python中是关键字.因此,用exec_()代替.


图片:简单的例子


一个应用图标

一个应用图标是一个用于显示在标题栏最左上角的小图像.在下面的例子中我们会在PyQt5中演示,同时我们还会介绍一个新的方法.

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里的编程意味着是OOP的.

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        ...
在面向对象编程中重要的是类、数据和方法.在这里,我们创建了一个叫Example的新类.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_())  

应用程序和例子对象被创建.主循环开始.


图片:图标


显示一个提示信息

我们可以为我们的任何一个窗体提供悬浮帮助信息.

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 QWidget widget')
        
        btn = QPushButton('Button', self)
        btn.setToolTip('This is a QPushButton 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))
这个静态方法设置了一种字体用于绘制提示信息.我们使用了10像素的SansSerif字体.

self.setToolTip('This is a QWidget widget')
要创建一个提示信息,我们要调用setTooltip()方法.我们可以直接用多格式文件来格式化它.

btn = QPushButton('Button', self)
btn.setToolTip('This is a QPushButton widget')
我们创建一个点击按钮并给它设置一个提示信息.

btn.resize(btn.sizeHint())
btn.move(50, 50)  
这是用于把按钮定义大小和在窗体位置的.sizeHint()方法会给按钮一个推荐的大小.


图片:提示信息

关闭一个窗口

最明显的关闭一个窗口是点击标题栏上的x.在下个例子中,我们会显示如何以编程的方式去关闭我们的窗口.我们会接触一点信号和槽.

下面是一个QPushButton部件构造器,我们会用在例子中.

QPushButton(string text, QWidget parent = None)

text参数是显示在按钮上的文本.parent是我们将按钮放置在哪里的部件.在我们这个例子,parent就是一个QWidget.一个应用程序的部件们会组成一个层次.在这个层次中,大多数的部件有着他们的父类.没有父类的部件就是最顶层的窗口.

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)
我们创建一个按钮.按钮是QPushButton类的一个实例.构造器的第一个参数是按钮的标签,第二个参数是父部件类.父部件是Example部件,是从QWidget继承来的.

qbtn.clicked.connect(QCoreApplication.instance().quit)
在PyQt5中的事件处理系统是用信号和槽机制构建起来的.如果我们点击按钮,点击信号就会发出.槽可以是一个Qt槽或任何Python可调用的.QCoreApplication包含了主要的事件循环;它处理并分派所有事件.instance()方法给我们它当前的实例.注意QCoreApplication是用QApplication创建的.点击信息被连接到quit()方法,它会终止程序.通信是在发送者和接收者这两个对象之间完成的.这里的发送者是点击按钮,接收者是程序对象.

图片:退出按钮

消息框

在默认情况下,如果我们点击标题栏的x,QWidget会被关闭.有时我们想修改一个默认情况.例如,如果我们在编辑器里有一个被打开的文件,我们做了一些修改.我们会想显示一个消息框来确认操作.

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按钮,我们会接受事件,它会导致部件关闭并终止程序.否则会忽略关闭事件.

图片:消息框

把窗口放在屏幕正中间

下面的脚本会显示我们如何并一个窗口放到桌面正中间.

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.topLeft())
我们移动程序窗口的左上角到qr矩形的左上角,因此将窗口放到屏幕正中心.

图片:正中心













你可能感兴趣的:(PyQt5)