First programs

来源:互联网 发布:linux查看版本命令 编辑:程序博客网 时间:2024/06/11 20:59

First programs

这一部分教程中,学习一些基本的功能。比如显示提示框、图标、关闭窗口、显示消息框和把框口放屏幕中间。

简单例子

这是个显示一个小窗口的简单例子。然而可对这个窗口做些操作。可以设置它的大小,最大化或者最小化。

import sysfrom PyQt5.QtWidgets import QApplication, QWidgetif __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 sysfrom PyQt5.QtWidgets import QApplication, QWidget

基本的控件在 PyQt5.QtWidgets 模块中

app = QApplication(sys.argv)

每个PyQt5应用必须创建application对象。sys.argv是命令行传入的参数。
python脚本可以从shell运行,它是其中一种控制脚本启动的方式

w = QWidget( )

QWidget控件是PyQt5中所有类的基类。
代码中我们调用了QWidget的默认构造器,默认的构造器没有父类。没有父类的控件叫做window

w.resize(250, 150)

该方法改变控件的大小。250PX 宽 、150PX 高

w.move(300, 300)

该方法移动控件到屏幕的(300 , 300)位置

w.setWindowTitle('Simple')

该方法设置window的title,该title显示在标题栏中

w.show()

该方法将控件显示在屏幕上。一个控件首先在内存中创建,然后显示在屏幕上

sys.exit(app.exec_())

最后,进入应用的主循环。
事件处理从这开始。主循环从窗口系统接收事件,然后向应用中的控件分发。
当调用 exit() 方法 或者 主控件销毁,主循环就会结束。
sys.exit()会确保 a clean exit。
注意exec_方法,因为exec是python的关键字,因此用exec_代替

应用图标

应用小图标通常显示在标题栏左上角,下面的例子介绍在PyQt5中如何做。并且介绍一些新方法。

环境并不显示应用图标。需要我们使能它们。

import sysfrom PyQt5.QtWidgets import QApplication, QWidgetfrom PyQt5.QtGui import QIconclass 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语言支持面向过程和面向对象。
这里写图片描述

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

面向对象的程序设计三个重要的东西是:类,数据和方法。
这里创建了一个叫 Example 的新类,这个类继承自 QWidget 类,这意味着我们调了两个构造器:第一个是Example的,第二个是父类的。super() 方法返回 Example 类的父类对象,并调用这个父类对象的构造器方法。python语言中 _init_() 是类的构造器方法

self.initUI()

UI相关操作放在这个方法中

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

上面三个方法继承自 QWidget 类。setGeometry() 做两件事:将window放在屏幕上并设置大小,前两个参数是定位坐标点,第三、四个参数分别是是window的宽度、高度,其实是resize()move() 两个方法的结合。为了设置应用图标,需要创建QIcon 对象,接受图标的路径作为参数

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

创建application和Example

显示提示框

可以为任意widget设置提示框

import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButtonfrom PyQt5.QtGui import QFontclass 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("ToolTip")        self.show()if __name__ == "__main__":    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())

这个例子中,为两个控件显示提示框
这里写图片描述

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

这个方法设置提示框里的字体和字体大小

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

调用setToolTip() 方法创建提示框,可以使用富文本格式

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

创建一个button,并为它设置提示框

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

sizeHint() 为button设置推荐的大小

关闭window

我们都知道可以通过点击标题栏的X号关闭库存窗口。下面介绍通过程序关闭window,并初步接触 signals ( 信号 ) 和 slots ( 槽 )

下面是 QPushButton 的构造器,我们会在例子中用到
QPushButton(string text, QWidget parent = None)
参数text是将在button上显示的文本,参数parent是一个放置这个button的控件。
应用的所有控件有层次结构,多用控件有父视图。顶层的window无父视图

import sysfrom PyQt5.QtWidgets import QWidget, QPushButton, QApplicationfrom PyQt5.QtCore import QCoreApplicationclass 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_())

例子中,创建了一个button,点击button,应用终止
这里写图片描述

from PyQt5.QtCore import QCoreApplication

从QtCore模块导入类QCoreApplication

qbtn = QPushButton('Quit', self)

这个button是QPushButton类的实例。构造器第一个参数是button上显示的文字,第二个参数是这个button的父控件,即继承自QWidget的Example控件

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

PyQt5事件处理系统建立在 signal & slot 机制上。
当点击按键时。点击 signal 被发射。
slot可以是Qt slot 或者 python 回调。
QCoreApplication包含主要的事件循环–处理和分发所有事件,instance方法返回QCoreApplication当前实例,注意,QCoreApplication实例由QApplication创建。点击 signal被连接到quit()方法,该方法可以结束应用。通讯是在发送者和接受者两个对象之间完成的,发送者是这个button,接受者是这个application对象

消息框

默认点击标题栏的X,QWidget就会关闭,有时我们想修改这个默认行为。例如,有个被打开的、编辑过的文件,我们会显示一个消息框来确认操作。

import sysfrom PyQt5.QtWidgets import QWidget, QMessageBox, QApplicationclass 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()事件处理器
message box

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

显示带有Yes和No的两个button的消息框,第一个字符串显示在标题栏上,第二个字符创是对话框内容,第三个参数指定显示在对话框中的按键组合,最后一个参数是默认获得焦点的button,返回值保存在replay变量中

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

这里是测试返回值。如果点击yes,就会处理这个close事件来终止应用,否则忽略close事件

将window放屏幕中间

下面的程序展示如何将window放在屏幕中间

import sysfrom PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplicationclass 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_())

QDesktopWidget 类提供屏幕的相关信息,包括屏幕的大小

self.center()

功能代码放在center()方法中

qr = self.frameGeometry()

返回一个指明主window几何结构的矩形,它包含窗口框架

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

计算出屏幕分辨率,根据分辨率得到中心点

qr.moveCenter(cp)

矩形已经有宽和高了,现在将矩形的中心点定位到屏幕的中心点上,矩形的大小不变

self.move(qr.topLeft())

移动 应用窗口的左上角 到 矩形左上角,这样,window就位于屏幕的中间了

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

原创粉丝点击