窗口事件包括改变窗口状态、调整位置和尺寸、窗口绘制、窗口关闭事件等。
改变窗口状态
下面的方法用来改变或判断窗口的状态,包括最小化,最大化,隐藏,显示等。
- 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()方法关闭窗口。
测试代码
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qt, QEventfrom PyQt5.QtGui import (QPainter, QWindowStateChangeEvent, QPaintEvent, QShowEvent, QHideEvent, QFont, QBrush)from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QMenu, QMessageBox, QStatusBar, QFrame, QPushButton, QHBoxLayout, QVBoxLayout, QInputDialog) class MyWidget(QFrame): def __init__(self, parent = None): super(MyWidget, self).__init__(parent) self.text = 'Hello, Python World' #窗口重绘事件 def paintEvent(self, evt): painter = QPainter(self) painter.setFont(QFont(self.font().family(), 20)) painter.setPen(Qt.blue) painter.drawText(self.rect(), Qt.AlignCenter, self.text) def setText(self, text): self.text = text #通知窗口重绘 self.update() def showEvent(self, evt): print('显示文本窗口') QWidget.showEvent(self, evt) def hideEvent(self, evt): print('隐藏文本窗口') QWidget.hideEvent(self, evt) class WindowEventDemo(QMainWindow): def __init__(self, parent = None): super(WindowEventDemo, self).__init__(parent) # 设置窗口标题 self.setWindowTitle('实战PyQt5: 窗口事件演示') # 设置窗口大小 self.resize(400, 320) self.initUi() def initUi(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) def changeEvent(self, evt): if evt.type() == QEvent.WindowStateChange: if self.isMinimized(): print('最小化窗口') elif self.isMaximized(): self.sBar.showMessage('最大化窗口', 1000) print('最大化窗口') elif self.isFullScreen(): self.sBar.showMessage('全屏显示', 1000) print('全屏显示') elif self.isActiveWindow(): print('活动窗口') QWidget.changeEvent(self, evt) def moveEvent(self, evt): info = 'x = {0}; y = {1}'.format(evt.pos().x(), evt.pos().y()) self.sBar.showMessage(info, 1000) def resizeEvent(self, evt): info = 'w = {0}; h = {1}'.format(evt.size().width(),evt.size().height()) self.sBar.showMessage(info, 1000) #窗口关闭事件 def closeEvent(self, evt): result = QMessageBox.question(self, '关闭应用', '确定关闭应用?', QMessageBox.Yes|QMessageBox.No, QMessageBox.No) if result == QMessageBox.Yes: evt.accept() QWidget.closeEvent(self, evt) else: evt.ignore() self.sBar.showMessage('忽略关闭事件', 1000) def onButtonSetTextClicked(self): text,ok=QInputDialog.getText(self, '文本输入对话框', '请输入要显示的文本') if ok: self.showText.setText(text) def onButtonShowWindow(self): if self.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绘制文字信息。
欢本文内容就关注, 收藏,点赞,评论和转发。