multiple gridlayout addwidget python window pyqt positioning

python - gridlayout - PyQt4: la ventana aparece en otra posición después de ocultar() y mostrar()



python pyqt5 gridlayout (2)

Usando PyQt4, cuando oculto una ventana y la muestro después, aparece en otra posición (al menos aquí en Linux). Código de ejemplo:

#!/usr/bin/python3 from PyQt4.QtGui import * app = QApplication([]) widget = QWidget() widget.setLayout(QVBoxLayout()) label = QLabel() widget.layout().addWidget(label) def hideShow(): widget.hide() widget.show() widget.layout().addWidget(QPushButton(''Hide/Show'', clicked = hideShow)) widget.show() app.exec_()

La ventana desaparece y aparece, pero un poco más abajo y a la derecha de la posición original. Creo que está desplazado por el tamaño del marco del administrador de ventanas alrededor del widget real.

¿Cómo puedo colocar la ventana en la posición exacta donde estaba? ¿Y por qué se mueve? ¿No debería quedarse donde está?


He tenido un problema similar con xfce. Tal vez podría obtener la posición antes de ocultarla (o al mostrarla, dependiendo de lo que desee), almacenarla y luego configurarla de nuevo con setGeometry ()? Un poco hacky quizás ...


En Linux, la colocación de ventanas puede ser muy impredecible. Consulte esta sección en la documentación de Qt para ver un desglose de los problemas.

Probablemente no haya una solución general al problema, pero para mí, configurar la geometría antes del show() inicial parece funcionar:

... widget.setGeometry(200, 200, 100, 50) widget.show() app.exec_()

ACTUALIZAR

Después de algunas pruebas con el administrador de ventanas de KDE, es posible que haya descubierto una posible solución.

Parece que llamar a show() inmediatamente después de hide() no le da al administrador de ventanas el tiempo suficiente para calcular la posición correcta de la ventana. Entonces, una solución simple es establecer explícitamente la geometría después de un pequeño retraso:

from PyQt4.QtGui import * from PyQt4.QtCore import QTimer app = QApplication([]) widget = QWidget() widget.setLayout(QVBoxLayout()) label = QLabel() widget.layout().addWidget(label) def hideShow(): widget.hide() QTimer.singleShot(25, showWidget) def showWidget(): widget.setGeometry(widget.geometry()) widget.show() widget.layout().addWidget(QPushButton(''Hide/Show'', clicked = hideShow)) widget.show() app.exec_()

Esto funciona para mí usando KDE-4.8 y OpenBox, pero por supuesto YMMV.