QWidget全屏显示产生多个resizeEvent

3 投票
1 回答
1319 浏览
提问于 2025-04-17 07:10

我有一个用Python和PySide写的QT应用程序,遇到了一个小问题,跟QGLWidget的showFullScreen方法有关(其实其他控件也会有这个问题):

问题是,当程序从全屏模式返回时,控件的“最终”分辨率并没有立即确定。这个切换似乎是在5到10毫秒后才触发的。

这对我来说是个问题,因为我需要在控件显示后进行一些依赖于控件大小的布局计算。

下面是一个小示例,它继承了QGLWidget。使用这个示例,你会发现showFullScreen之后,resizeEvent会被调用两次。

我在寻找一种方便的方法来判断哪个resizeEvent是“最终”的,或者有什么办法可以知道控件到底什么时候真正进入了全屏模式。有没有可能有一些信号可以连接呢?

非常感谢任何帮助。

#!/usr/bin/python

import sys
from PySide.QtGui import QApplication
from PySide.QtCore import QTimer
from PySide.QtOpenGL import QGLWidget

class TestWidget(QGLWidget):
    def __init__(self, parent=None):
        super(TestWidget, self).__init__(parent)
        self._timer = QTimer()
        self._timer.setInterval(5)
        self._timer.timeout.connect(self.showsize)
        self._timer.start()

    def resizeEvent(self, event):
        print "Resize event:", event.size().width(), event.size().height()

    def showsize(self):
        w = widget.size().width()
        print "Timer: ", w, widget.size().height()
        if w == 1680:
           self._timer.stop()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = TestWidget()
    widget.showFullScreen()
    print "After showFullScreen:", widget.size().width(), widget.size().height()
    # this will always be 640 480...1680 1050 is what I'm expecting
    app.exec_()

1 个回答

0

一种可能性是检查一下这个调整大小的事件是否是自发的。根据我在这里有限的测试(使用Qt C++在Linux上),第二次调整大小的事件是自发的,而第一次则不是。

你可以只在事件是自发的时候进行计算。

注意:我不太确定这个方法在不同的系统上是否都适用,可能会依赖于你的窗口管理器或窗口系统。

撰写回答