QWidget showFullScreen создает несколько событий resizeEvents

У меня есть приложение QT, написанное на python с использованием PySide, и я наткнулся на небольшую проблему, связанную с методом showFullScreen QGLWidget (хотя проблема возникает и с любым другим виджетом):

Проблема в том, что виджет не имеет своего «окончательного» разрешения после того, как программа возвращается из showFullScreen. Переключатель, кажется, срабатывает асинхронно между 5 и 10 миллисекундами позже.

Это проблема для меня, потому что мне нужно выполнить некоторые расчеты макета, которые зависят от размера виджета после его отображения.

Ниже приведен небольшой репродуктор, который является подклассом QGLWidget. Используя этот репродуктор, вы заметите, что resizeEvent будет вызываться дважды после showFullScreen.

Я ищу удобный способ узнать, какой 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_()

person Chris    schedule 27.11.2011    source источник


Ответы (1)


Одна из возможностей — проверить, является ли событие изменения размера спонтанным или нет. Из-за ограниченного тестирования здесь (с использованием Qt C++ в Linux) второе событие изменения размера является спонтанным, а первое - нет.

Вы можете делать свои расчеты только тогда, когда событие спонтанно.

Примечание: я не уверен, насколько это переносимо, это может зависеть от вашего оконного менеджера/оконной системы.

person Mat    schedule 27.11.2011
comment
Большое спасибо. Вроде работает под линуксом. В ближайшее время попробую под окнами. - person Chris; 27.11.2011