2012-11-19 6 views
6

Utilizzando PyQt4, quando nascondo una finestra e la mostro in seguito, appare in un'altra posizione (almeno qui su Linux). Esempio codice:PyQt4: la finestra appare in un'altra posizione dopo hide() e show()

#!/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 finestra scompare e viene visualizzata, ma un po 'in basso ea destra della posizione originale. Penso che sia spostato dalle dimensioni del frame del gestore finestre attorno al widget attuale.

Come posso posizionare la finestra nella posizione esatta in cui si trovava? E perché si muove del tutto? Non dovrebbe rimanere dov'è?

risposta

2

Su Linux, il posizionamento delle finestre può essere molto imprevedibile. Vedere this section nella documentazione Qt per una ripartizione dei problemi.

Probabilmente non c'è una soluzione generale al problema, ma per me, l'impostazione della geometria prima l'iniziale show() sembra funzionare:

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

UPDATE

Dopo alcuni test con KDE window manager, potrei aver scoperto una potenziale soluzione.

Sembra che chiamare show() immediatamente dopo hide() non dia al gestore di finestre il tempo sufficiente per calcolare la posizione della finestra corretta. Quindi, una soluzione semplice è quella di impostare in modo esplicito la geometria dopo un piccolo ritardo:

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_() 

Questo funziona per me usando KDE-4.8 e OpenBox, ma naturalmente YMMV.

+0

Bene, allora penso che non si possa risolvere questo problema, poiché l'impostazione della geometria prima dello show iniziale() sarà di aiuto solo quando nascondere e mostrare la finestra viene eseguita da quella posizione e la finestra non è stata spostata. –

+0

@TobiasLeupold. Per me, spostare la finestra tra i clic del pulsante "Nascondi/Mostra" non fa alcuna differenza (cioè la posizione rimane costante). Se commento la riga 'setGeometry', la finestra salta su e verso sinistra sul * primo * clic, ma rimane costante. Questo sta usando il gestore di finestre di OpenBox. Quale gestore di finestre stai usando? – ekhumoro

+0

Io uso KDE 4.8.5 su Gentoo Linux. –

0

Ho avuto problemi simili con xfce. Forse potresti ottenere la posizione prima di nasconderla (o visualizzarla, a seconda di cosa vuoi), salvarla e poi impostarla quando viene visualizzata di nuovo con setGeometry()? Forse un po 'hacky ..

+0

Ho provato entrambi pos = widget.geometry() e pos = widget.frameGeometry() prima di hide() e widget.setGeometry (pos) senza alcun effetto. La finestra appare nella stessa posizione spostata. –