QWidget showFullScreen создает несколько resizeEvents - PullRequest
3 голосов
/ 27 ноября 2011

У меня есть приложение 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_()

1 Ответ

0 голосов
/ 27 ноября 2011

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

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

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

...