事件消息
# -*- coding:utf-8 -*-
from PyQt5.Qt import *
import sys
class example(QWidget):
def __init__(self):
#调用父类的init方法,建立窗口
super().__init__()
self.setWindowTitle('事件消息')
self.resize(500, 500)
self.center
self.initWindow()
self.show()
def initWindow(self):
pass
def showEvent(self,QShowEvent):
print('窗口展示事件!')
def moveEvent(self,QMoveEvent):
print('窗口被移动了')
def resizeEvent(self,QResizeEvent):
print('窗口改变了尺寸大小')
def enterEvent(self,QEvent):
print('鼠标放进来了')
def leaveEvent(self,QEvent):
print('鼠标离开了')
def mousePressEvent(self,QMouseEvent):
print('鼠标按下了')
def mouseReleaseEvent(self, QMouseEvent):
print('鼠标被释放了')
def mouseDoubleClickEvent(self,QMouseEvent):
print('鼠标被双击了')
def mouseMoveEvent(self,QMouseEvent):
print('鼠标在移动')
#键盘事件
def keyPressEvent(self,QKeyEvent):
print('键盘上某一个键被按下 了')
def keyReleaseEvent(self,QKeyEvent):
print('键盘上某一个键被释放 了')
#焦点事件--用于查看焦点事件
def closeEvent(self,event):
print('窗口关闭事件')
qm=QMessageBox.question(self,'message','你确定要退出吗',
QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
if qm ==QMessageBox.Yes:
event.accept()#接收事件
else:
event.ignore()#忽略事件
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_())
事件转发机制
# -*- coding:utf-8 -*-
from PyQt5.Qt import *
import sys
class Window(QWidget):
def mousePressEvent(self,QMouseEvent):
print('顶层窗口被按下')
class midWindow(QWidget):
def mousePressEvent(self,QMouseEvent):
print('中间窗口被按下')
class label(QLabel):
def mousePressEvent(self,evt):
print('标签控件被按下')#如果这里没有任何处理,只有pass,那么事件会被传给父对象
# evt.accept()事件已处理标识
# evt.ignore()事件忽略标识,如果忽略了,那么事件就会继续享受传递,直到accept标识为True
print(evt.isAccepted())#事件是否已经被接收了
if __name__ =='__main__':
app=QApplication(sys.argv)
win=Window()
win.resize(500,500)
win.setStyleSheet('background-color:blue;')
mid=midWindow(win)
mid.resize(300,300)
mid.setAttribute(Qt.WA_StyledBackground,True)
mid.setStyleSheet('background-color:yellow;')
labe=label(mid)
labe.resize(100,100)
labe.setStyleSheet('background-color:cyan;')
labe.setText('这是一个标签')
btn=QPushButton(mid)
btn.setText('我是按钮')
btn.move(100,100)#按钮中会处理按下事件,所以不会向父控件传递这个事件
label_1=QLabel(mid)
label_1.resize(100,100)
label_1.move(200,200)
label_1.setStyleSheet('background-color:cyan;')
label_1.setText('这是一个标签')#label里面没有处理事件,则会向父类传递,即点击后会调用mid的press事件
win.show()
sys.exit(app.exec_())
事件案例:1.鼠标进入与离开 2.监听键盘输入 3.鼠标移动与窗口移动
from PyQt5.Qt import *
import sys
class Win(QWidget):
def __init__(self):
super().__init__()
self.moveflag=False#moveflag,当鼠标点击时变为true,此时才进行窗口移动操作
self.resize(500, 500)
self.setWindowTitle('事件案例1,2,3')
#案例1:鼠标进入和鼠标离开方法
def enterEvent(self, QEvent):
self.setWindowTitle('鼠标进来了')
def leaveEvent(self, QEvent):
self.setWindowTitle('鼠标离开了')
#案例3:鼠标在标签中点击移动,窗口也随之移动
def mousePressEvent(self, evt):
if evt.button()==Qt.LeftButton:#当点击鼠标左键时,才进行移动操作
self.moveflag=True
#先获取到鼠标点击的起始位置
self.global_x=evt.globalX()
self.global_y=evt.globalY()
print(self.global_x,self.global_y)
self.w_x=self.x()
self.w_y=self.y()
def mouseMoveEvent(self, evt):
if self.moveflag:
#计算出鼠标当前move了多少向量
move_x=evt.globalX()-self.global_x
move_y=evt.globalY()-self.global_y
#将窗口移动相应向量
self.move(self.w_x+move_x,self.global_y+move_y)
def mouseReleaseEvent(self, evt):
self.moveflag=False#鼠标放开后,flag恢复原状
class lab(QLabel):
#案例2:键盘按键监听方法
def keyPressEvent(self, evt):
print('键盘被点击了')
if evt.key()==Qt.Key_E:
print('E键被点击了')
elif evt.modifiers()==Qt.ControlModifier | Qt.ShiftModifier and evt.key()==Qt.Key_E:
print('组合键ctr +shift +E')
if __name__=='__main__':
app=QApplication(sys.argv)
win=Win()
win.setMouseTracking(True)#这里设定了鼠标追踪,如果win中没有moveflag的话,程序会崩溃
label=lab(win)
label.resize(100,100)
label.setText('这是一个标签')
label.setStyleSheet('background-color:cyan')
label.grabKeyboard()
win.show()
sys.exit(app.exec_())