First programs
这一部分教程中,学习一些基本的功能。比如显示提示框、图标、关闭窗口、显示消息框和把框口放屏幕中间。
简单例子
这是个显示一个小窗口的简单例子。然而可对这个窗口做些操作。可以设置它的大小,最大化或者最小化。
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控件是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 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语言支持面向过程和面向对象。
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 sys
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton
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("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 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_())
例子中,创建了一个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 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的两个button的消息框,第一个字符串显示在标题栏上,第二个字符创是对话框内容,第三个参数指定显示在对话框中的按键组合,最后一个参数是默认获得焦点的button,返回值保存在replay变量中
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
这里是测试返回值。如果点击yes,就会处理这个close事件来终止应用,否则忽略close事件
将window放屏幕中间
下面的程序展示如何将window放在屏幕中间
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_())
QDesktopWidget 类提供屏幕的相关信息,包括屏幕的大小
self.center()
功能代码放在center()方法中
qr = self.frameGeometry()
返回一个指明主window几何结构的矩形,它包含窗口框架
cp = QDesktopWidget().availableGeometry().center()
计算出屏幕分辨率,根据分辨率得到中心点
qr.moveCenter(cp)
矩形已经有宽和高了,现在将矩形的中心点定位到屏幕的中心点上,矩形的大小不变
self.move(qr.topLeft())
移动 应用窗口的左上角 到 矩形左上角,这样,window就位于屏幕的中间了