2.1 基本功能
2.1.1 简单的窗口
程序展示
本例中,展示一个小窗口
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_())
运行上面的代码,能展示出一个小窗口
代码解释
这里引入了PyQt5.QtWidgets
模块,这个模块包含了基本的组件
import sys
from PyQt5.QtWidgets import QApplication, QWidget
每个PyQt5应用都必须创建一个应用对象。sys.argv
是一组命令行参数的列表,Python可以在shell里运行,这个参数提供对脚本控制的功能
app = QApplication(sys.argv)
QWidge
控件是一个用户界面的基本控件,它提供了基本的应用构造器。默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口
w = QWidget()
resize()
:改变控件的大小,这里将窗口的宽设为250px,高设为150px
w.resize(250, 150)
move()
:修改控件位置的,这里是把控件放置到屏幕坐标(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角
w.move(300, 300)
setWindowTitle()
:给窗口添加标题
w.setWindowTitle('Simple')
show()
:让控件在桌面上显示出来(控件先在内存中创建,然后在显示器上显示)
w.show()
最后,程序进入了应用的主循环中,事件处理器这个时候开始工作。主循环从窗口上接收事件,并把事件派发到应用控件里。当调用exit()
方法或直接销毁主控件时,主循环就会结束。
sys.exit()
:让主循环安全退出。exec_()
之所以有个下划线,是因为exec
是一个Python的关键字
sys.exit(app.exec_())
2.1.2 带窗口图标
窗口图标通常是显示在窗口的左上角,标题栏的最左边
程序展示
本例中,创建带有窗口图标的窗口
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(400, 300, 400, 300)
self.setWindowTitle("Icon")
self.setWindowIcon(QIcon('icon.jpg'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
代码解释
创建一个类,这个类继承自QWidget
,super()
构造器方法返回父级的对象
class Example(QWidget):
def __init__(self):
super().__init__()
...
使用initUI()
方法创建一个GUI
self.initUI()
setGeometry()
:把窗口放到屏幕上并且设置窗口大小,参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是resize()
和move()
的合体
self.setGeometry(400, 300, 400, 300)
setWindowIcon()
:添加了图标。先创建一个QIcon对象,然后接受一个路径作为参数显示图标。
# 自己准备一个icon.jpg
self.setWindowTitle("Icon")
self.setWindowIcon(QIcon('icon.jpg'))
实例化对象,主循环开始。
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
2.1.3 提示框
程序展示
本例中,创建一个提示框
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QToolTip, QPushButton
from PyQt5.QtGui import QFont, QIcon
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(400, 300, 400, 300)
self.setWindowIcon(QIcon('icon.jpg'))
self.setWindowTitle("提示框")
QToolTip.setFont(QFont("微软雅黑", 20))
b = QPushButton('按钮', self)
b.resize(b.sizeHint())
b.move(50, 20)
b.setToolTip('hello, this is a <b style="color:red;">button</b>')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
代码解释
这个静态方法设置了提示框的字体,下面使用了20px的微软雅黑字体
QToolTip.setFont(QFont("微软雅黑", 20))
创建一个按钮,并且为按钮添加了一个提示框
b = QPushButton('按钮', self)
调整按钮大小,并让按钮在屏幕上显示出来,sizeHint()
:默认的按钮大小
b.resize(b.sizeHint())
b.move(50, 20)
当鼠标移动到按钮上是,显示提示文本
b.setToolTip('hello, this is a <b style="color:red;">button</b>')
2.1.4 关闭窗口
关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口
本例使用的是QPushButton组件类
QPushButton(string text, QWidget parent = None)
参数:
-
text
:按钮名称 -
parent
:按钮放在哪个组件上面
应用中的组件都是一层一层的,大部分的组件都有自己的父级,没有父级的组件,是*的窗口
这里创建一个点击之后就退出窗口的按钮
程序展示
本例中,创建一个退出应用的按钮
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
from PyQt5.QtCore import QCoreApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(400, 300, 400, 300)
self.setWindowTitle("关闭窗口")
b = QPushButton('退出', self)
b.clicked.connect(QCoreApplication.instance().quit)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
e = Example()
sys.exit(app.exec_())
程序预览:
代码解释
程序需要QtCore
对象
from PyQt5.QtCore import QCoreApplication
创建一个按钮
b = QPushButton('Quit', self)
点击按钮之后,信号会被捕捉并给出既定的反应。QCoreApplication
包含了事件的主循环,它能添加和删除所有的事件,instance()
创建了一个它的实例。点击事件和终止进程并退出应用的quit()
绑定在了一起,在发送者和接受者之间建立了通讯,发送者就是按钮,接受者就是应用对象。
b.clicked.connect(QCoreApplication.instance().quit)
2.1.5 消息盒子
默认情况下,我们点击标题栏的×按钮,QWidget就会关闭。但是有时候,我们修改默认行为。比如,如果我们打开的是一个文本编辑器,并且做了一些修改,我们就会想在关闭按钮的时候让用户进一步确认操作。
如果关闭QWidget,就会产生一个QCloseEvent,并且把它传入到closeEvent函数的event参数中。改变控件的默认行为,就是替换掉默认的事件处理。
程序展示
本例中,创建一个消息盒子,用于关闭窗口是弹出提示
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox
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, e):
reply = QMessageBox.question(
self, "Message", "你确定要退出吗?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
e.accept()
else:
e.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序预览:
代码解释
点击右上角的×时,会触发该事件
def closeEvent(self, e):
....
创建一个消息框,上面有两个按钮:Yes和No
第一个字符串显示在消息框的标题栏,第二个字符串显示在对话框,第三个参数是消息框的两个按钮,最后一个参数是默认是选中的按钮
reply = QMessageBox.question(
self, "Message", "你确定要退出吗?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
这里判断返回值,如果点击的是Yes按钮,就关闭组件和应用,否者就忽略关闭事件
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
2.1.6 窗口居中
程序展示
QtGui.QDesktopWidget
提供了用户的桌面信息,包括屏幕的大小。
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)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序预览:
代码解释
这个方法实现对话框居中
self.center()
获得主窗口的中心点、大小,返回PyQt5.QtCore.QRect
对象
qr = self.frameGeometry()
获取显示器的分辨率,然后得到屏幕中间点的位置,返回PyQt5.QtCore.QPoint
对象
cp = QDesktopWidget().availableGeometry().center()
然后把主窗口框架的中心点放置到屏幕的中心位置
qr.moveCenter(cp)