窗口事件包括改变窗口状态、调整位置和尺寸、窗口绘制、窗口关闭事件等。
改变窗口状态下面的方法用来改变或判断窗口的状态,包括最小化,最大化,隐藏,显示等。
- changeEvent(self,event): 当控件的窗口状态的状态发生变化时调用。event参数包含QwindowStateChangeEvent类实例。
- showEvent(self,event):当控件显示时调用。event参数包含QShowEvent类的实例。
- hideEvent(self,event):当控件隐藏时调用。event参数包含QHideEvent类的实例。
当移动窗口时,会调用moveEvent()方法;窗口的尺寸发生改变时,会调用resizeEvent()方法。
- moveEvent(self,event):窗口移动时,将持续调用该方法。event参数包含QMoveEvent类的实例,通过该类的下列方法获得窗口信息:
pos():返回包括窗口当前坐标的QPoint类对象;
oldPos():返回包括窗口移动前坐标的QPoint类对象。
- resizeEvent(self,event):调整窗口尺寸时,将持续调用该方法。event参数包含QResizeEvent类的实例,通过该类的下列方法获得窗口信息:
size():返回包括窗口当前尺寸的QSize类对象;
oldSize():返回包括窗口调整前尺寸的QSize类对象
窗口重绘当控件或者控件的部分可见时,控件需要重绘。这时,将调用paintEvent(self, evnet)执行重绘动作。event参数包含QPaintEvent类的实例,通过该类的以下方法可以区域信息:
rect():返回包含需要重绘区域的QRect类的对象
region():返回包含需要重绘区域的QRegiont类的对象
通过以上函数,可以确定部件的重绘窗口区域,重绘区域有可能只是控件的某一部分而不是整个控件,这样做,可以大大提高重绘的效率。Qt在重绘的时候,为了提高效率,会将多个重绘事件组合在一起处理。因此,需要立即重绘时,需要QWidget的repaint()或update()方法来执行重绘操作
repaint(): 立即调用paintEvent()重绘。只要控件不是隐藏状态,不受setUpdatesEnabed()影响。函数格式有:repaint(),repaint(X,Y,Width,Height), repaint(QRect), repaint(QRegion)。
update():发送需要重新绘制控件的消息。如果控件不是隐藏状态,更新不被禁止。该事件将在主应用程序的事件循环中处理。如果一次有几个update()消息,系统则会将它们合并成一个消息,避免产生屏幕闪烁。建议使用此方法而不是repaint()。函数格式有:update (),update (X,Y,Width,Height), update (QRect), update (QRegion)。
窗口关闭通过单击窗口标题栏中的关闭按钮或调用close()方法来关闭窗口时,closeEvent(self,event)方法被调用。通过event参数可获得QCloseEvent类的一个对象,调用该对象的ignore()方法,则可以取消窗口关闭操作,否则调用accept()方法关闭窗口。
测试代码importsys
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimportQt,QEvent
fromPyQt5.QtGuiimport(QPainter,QWindowStateChangeEvent,QPaintEvent,
QShowEvent,QHideEvent,QFont,QBrush)
fromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QMenu,QMessageBox,
QStatusBar,QFrame,QPushButton,QHBoxLayout,QVBoxLayout,
QInputDialog)
classMyWidget(QFrame):
def__init__(self,parent=None):
super(MyWidget,self).__init__(parent)
self.text='Hello,PythonWorld'
#窗口重绘事件
defpaintEvent(self,evt):
painter=QPainter(self)
painter.setFont(QFont(self.font().family(),20))
painter.setPen(Qt.blue)
painter.drawText(self.rect(),Qt.AlignCenter,self.text)
defsetText(self,text):
self.text=text
#通知窗口重绘
self.update()
defshowEvent(self,evt):
print('显示文本窗口')
QWidget.showEvent(self,evt)
defhideEvent(self,evt):
print('隐藏文本窗口')
QWidget.hideEvent(self,evt)
classWindowEventDemo(QMainWindow):
def__init__(self,parent=None):
super(WindowEventDemo,self).__init__(parent)
#设置窗口标题
self.setWindowTitle('实战PyQt5:窗口事件演示')
#设置窗口大小
self.resize(400,320)
self.initUi()
definitUi(self):
self.sBar=QStatusBar(self)
self.setStatusBar(self.sBar)
mainWidget=QWidget()
mainLayout=QVBoxLayout()
self.showText=MyWidget()
btnSetText=QPushButton('设置显示文本')
btnSetText.clicked.connect(self.onButtonSetTextClicked)
self.btnShowWindow=QPushButton('隐藏窗口')
self.btnShowWindow.clicked.connect(self.onButtonShowWindow)
self.showWindow=True
hLayout=QHBoxLayout()
hLayout.addWidget(self.btnShowWindow)
hLayout.addWidget(btnSetText)
mainLayout.addLayout(hLayout)
mainLayout.addWidget(self.showText)
mainWidget.setLayout(mainLayout)
self.setCentralWidget(mainWidget)
defchangeEvent(self,evt):
ifevt.type()==QEvent.WindowStateChange:
ifself.isMinimized():
print('最小化窗口')
elifself.isMaximized():
self.sBar.showMessage('最大化窗口',1000)
print('最大化窗口')
elifself.isFullScreen():
self.sBar.showMessage('全屏显示',1000)
print('全屏显示')
elifself.isActiveWindow():
print('活动窗口')
QWidget.changeEvent(self,evt)
defmoveEvent(self,evt):
info='x={0};y={1}'.format(evt.pos().x(),evt.pos().y())
self.sBar.showMessage(info,1000)
defresizeEvent(self,evt):
info='w={0};h={1}'.format(evt.size().width(),evt.size().height())
self.sBar.showMessage(info,1000)
#窗口关闭事件
defcloseEvent(self,evt):
result=QMessageBox.question(self,'关闭应用','确定关闭应用?',
QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
ifresult==QMessageBox.Yes:
evt.accept()
QWidget.closeEvent(self,evt)
else:
evt.ignore()
self.sBar.showMessage('忽略关闭事件',1000)
defonButtonSetTextClicked(self):
text,ok=QInputDialog.getText(self,'文本输入对话框','请输入要显示的文本')
ifok:
self.showText.setText(text)
defonButtonShowWindow(self):
ifself.showText.isVisible():
self.btnShowWindow.setText('显示窗口')
self.showText.hide()
else:
self.btnShowWindow.setText('隐藏窗口')
self.showText.show()
if__name__=='__main__':
app=QApplication(sys.argv)
window=WindowEventDemo()
window.show()
sys.exit(app.exec())
运行结果如下图:
窗口事件测试
本文知识点- 窗口状态事件;
- 窗口位置和尺寸事件;
- 窗口重绘事件;
- 窗口关闭事件;
- 使用QPainter绘制文字信息。
欢本文内容就关注, 收藏,点赞,评论和转发。