#无特殊注明,所有案例只修改第一个案例的对应部分
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
# 继承QWidget,用户界面的基本控件,提供了基本的应用构造器
# 默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口(window)
class Example(QWidget):
# 继承父类构造
def __init__(self):
super().__init__()
# 使用initUI()方法创建一个GUI
self.initUI()
# 初始化组件
def initUI(self):
# 创建一个LCD屏幕和水平滑块
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
# 创建一个垂直布局,并将组件添加进去
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
# 将垂直布局放入窗口
self.setLayout(vbox)
# 将sld的值与lcd的屏幕绑定
sld.valueChanged.connect(lcd.display)
# 不注释了
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle('Signal and slot')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
# 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
sys.exit(app.exec_())
# 初始化组件
def initUI(self):
# 不注释了
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle('Event handler')
self.show()
# 重写事件处理器函数
def keyPressEvent(self, e):
# 按下Esc键关闭程序
if e.key() == Qt.Key_Escape:
self.close()
# 初始化组件
def initUI(self):
# 创建一个QGridLayout实例
grid = QGridLayout()
grid.setSpacing(10)
# 初始化x,y
x = 0
y = 0
# 创建一个标签显示x,y的值
self.text = "x: {0}, y: {1}".format(x, y)
self.label = QLabel(self.text, self)
# 将标签加入grid
grid.addWidget(self.label, 0, 0, Qt.AlignTop)
# 事件追踪默认没有开启,当开启后才会追踪鼠标的点击事件
self.setMouseTracking(True)
# 将QGridLayout实例放到窗口里
self.setLayout(grid)
# 不注释了
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle('Event object')
self.show()
# e代表了事件对象,里面有我们触发事件(鼠标移动)的事件对象
def mouseMoveEvent(self, e):
# 获取鼠标的坐标
x = e.x()
y = e.y()
# 更新text和label的值
text = "x: {0}, y: {1}".format(x, y)
self.label.setText(text)
这里使用的是QMainWindow
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class Example(QMainWindow):
# 继承父类构造
def __init__(self):
super().__init__()
# 使用initUI()方法创建一个GUI
self.initUI()
# 初始化组件
def initUI(self):
# 按钮1
btn1 = QPushButton("Button 1", self)
btn1.move(30, 50)
# 按钮2
btn2 = QPushButton("Button 2", self)
btn2.move(150, 50)
# 绑定自定义函数
btn1.clicked.connect(self.buttonClicked)
btn2.clicked.connect(self.buttonClicked)
# 状态栏
self.statusBar()
# 不注释了
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle('Event sender')
self.show()
# 自定义按钮点击函数
def buttonClicked(self):
# 调用sender()方法的方式决定了事件源
sender = self.sender()
# 显示事件源的text值+str
self.statusBar().showMessage(sender.text() + ' was pressed')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
# 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
sys.exit(app.exec_())
# 自定义按钮点击函数
def buttonClicked(self):
# 调用sender()方法的方式决定了事件源
sender = self.sender()
# 显示事件源的text值+str
self.statusBar().showMessage(sender.text() + ' was pressed')
QObject实例能发送事件信号,下面的例子是发送自定义的信号
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
# Communicate类创建了一个pyqtSignal()属性的信号
class Communicate(QObject):
closeApp = pyqtSignal()
class Example(QMainWindow):
#不注释了
def __init__(self):
super().__init__()
self.initUI()
# 初始化组件
def initUI(self):
# closeApp信号QMainWindow的close()方法绑定
self.c = Communicate()
self.c.closeApp.connect(self.close)
# 不注释了
self.setGeometry(300, 300, 300, 250)
self.setWindowTitle('Emit signal')
self.show()
# 点击窗口的时候,发送closeApp信号,程序终止
def mousePressEvent(self, event):
self.c.closeApp.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
# 进入应用的主循环中,调用exit()方法或直接销毁主控件时,主循环就会结束
sys.exit(app.exec_())