美文网首页
PyQt5编程(17):窗口事件

PyQt5编程(17):窗口事件

作者: 用电热毯烤猪 | 来源:发表于2018-01-01 21:40 被阅读0次

    1.改变窗口状态
    下列的方法可用来改变或判断窗口的状态(最小化、最大化、隐藏和显示):

    changeEvent(self,event): 当窗口、应用程序、控件的状态发生变化时调用。event参数包含QWindowStateChangeEvent类实例。
    showevent(self,event):当控件显示时调用。event参数包含QShowEvent类的实例。
    showevent(self,event):当控件隐藏时调用。event参数包含QHideEvent类的实例。
    
    下面的代码为在控制台显示窗口的最小化、最大化、隐藏和显示状态。
    

    -- coding: utf-8 --

    from PyQt5 import QtCore, QtWidgets

    class MyWindow(QtWidgets.QWidget):
    def init(self, parent=None):
    QtWidgets.QWidget.init(self, parent)
    self.resize(300, 100)
    def changeEvent(self, e):
    if e.type() == QtCore.QEvent.WindowStateChange:
    if self.isMinimized():
    print("窗口最小化")
    elif self.isMaximized():
    print("窗口最大化")
    elif self.isFullScreen():
    print("全屏显示")
    elif self.isActiveWindow():
    print("活动窗口")
    QtWidgets.QWidget.changeEvent(self, e)
    def showEvent(self, e):
    print("窗口显示")
    QtWidgets.QWidget.showEvent(self, e)
    def hideEvent(self, e):
    print("窗口隐藏")
    QtWidgets.QWidget.hideEvent(self, e)

    if name == "main":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

    2.改变窗口的位置和尺寸
    移动窗口、调整窗口尺寸时,下列方法将被调用:

    moveEvent(self,event):窗口移动时,该方法被持续调用。event参数包含QMoveEvent类的实例,通过该类的下列方法获得窗口信息:
        pos():返回包括窗口当前坐标的QPoint类对象;
        oldPos():返回包括窗口移动前坐标的QPoint类对象;
    resizeEvent(self,event):调整窗口尺寸时,该方法被持续调用。event参数包含QResizeEvent类的实例,通过该类的下列方法获得窗口信息:
        size():返回包括窗口当前尺寸的QSize类对象;
        oldSize():返回包括窗口调整前尺寸的QSize类对象;
    
    下面例子展示了如何处理窗口位置和和尺寸。
    

    -- coding: utf-8 --

    from PyQt5 import QtWidgets

    class MyWindow(QtWidgets.QWidget):
    def init(self, parent=None):
    QtWidgets.QWidget.init(self, parent)
    self.resize(300, 100)
    def moveEvent(self, e):
    print("x = {0}; y = {1}".format(e.pos().x(), e.pos().y()))
    QtWidgets.QWidget.moveEvent(self, e)
    def resizeEvent(self, e):
    print("w = {0}; h = {1}".format(e.size().width(),e.size().height()))
    QtWidgets.QWidget.resizeEvent(self, e)

    if name == "main":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

    3.重绘窗口
    当控件或控件的部分变为可见时,控件需要重绘。此时,paintEvent(self,event)被调用。event参数包含QPaintEvent类的实例,通过该类有以下方法:

    rect():返回包含需要重绘区域坐标和尺寸的QRect类的对象;
    region():返回包含需要重绘区域的QRegiont类的对象;
    
    通过这些函数,可以知道哪些被其他窗口遮挡,现在又重新显示在可见区。重绘部分控件而不是全部,可以大大提高程序的性能。
    需要注意一点,系统为了提高率,会将多个重绘事件合在一起处理。所以需要立即重绘时,要调用QWidget类的下列方法:
    
    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)
    

    4.阻止窗口关闭
    通过单击窗口标题栏中的关闭按钮或调用close()方法来关闭窗口时,closeEvent(self,event)方法被调用。 通过event参数可获得QCloseEvent类的一个对象。 为了防止窗口关闭,必须通过该对象调用ignore()方法,否则调用accept()方法。
    下面的例子为:单击关闭按钮将显示一个标准对话框,要求确认是否关闭该窗口。 如果用户单击“是”按钮,则关闭窗口;如果用户单击“否”按钮,则仅关闭对话框,窗口不会被关闭。

    -- coding: utf-8 --

    from PyQt5 import QtWidgets

    class MyWindow(QtWidgets.QWidget):
    def init(self, parent=None):
    QtWidgets.QWidget.init(self, parent)
    self.resize(300, 100)
    def closeEvent(self, e):
    result = QtWidgets.QMessageBox.question(self,
    "关闭窗口确认",
    "真的要关闭窗口?",
    QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
    QtWidgets.QMessageBox.No)
    if result == QtWidgets.QMessageBox.Yes:
    e.accept()
    QtWidgets.QWidget.closeEvent(self, e)
    else:
    e.ignore()

    if name == "main":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

    相关文章

      网友评论

          本文标题:PyQt5编程(17):窗口事件

          本文链接:https://www.haomeiwen.com/subject/vxrxnxtx.html