2012-11-19 19 views
6

PyQt4を使用して、ウィンドウを非表示にしてから表示すると、別の位置に表示されます。例コード:PyQt4:hide()と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_() 

ウィンドウが消えて表示されますが、元の位置の右下に表示されます。私はそれが実際のウィジェットの周りのウィンドウマネージャーの枠のサイズによって置き去られていると思います。

私はどのようにウィンドウを正確な位置に配置できますか?そして、なぜそれはまったく動きますか?それはどこにあるべきですか?

答えて

2

Linuxでは、ウィンドウの配置は非常に予測できません。問題の内訳については、Qtのドキュメントのthis sectionを参照してください。

あり問題に対する一般的な解決策は、おそらくませんが、私のために、前にジオメトリを設定すると、初期show()が動作しているようです:KDEといくつかのテストの後

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

UPDATE

ウィンドウマネージャー、私は潜在的な解決策を発見したかもしれません。

show()hide()の直後に呼び出しても、正しいウィンドウ位置を計算するのに十分な時間がウィンドウマネージャに与えられないようです。だから、簡単な回避策は、明示的にわずかな遅延の後にジオメトリを設定することです:

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

これは私がKDE-4.8およびこのOpenBox、もちろんのメーリングリストを使用して動作します。

+0

さて、最初のshow()の前にジオメトリを設定すると隠れて、その位置からウィンドウが表示され、ウィンドウが移動されていないときにのみ役立つので、この問題を解決できないと思います。 –

+0

@TobiasLeupold。私にとっては、「非表示/表示」ボタンのクリック間でウィンドウを移動しても差はありません(つまり、位置は一定のままです)。 'setGeometry'行をコメントアウトすると、*最初のクリックでウィンドウが左上にジャンプしますが、それでも一定のままです。これは、OpenBoxウィンドウマネージャを使用しています。どのウィンドウマネージャを使用していますか? – ekhumoro

+0

私はGentoo LinuxでKDE 4.8.5を使用しています。 –

0

xfceにも同様の問題があります。おそらく、あなたはそれを隠す(またはあなたが望むものに応じてそれを表示する)前に位置を取得し、それを保存してからsetGeometry()で再び表示されるときに設定することができますか?おそらく少しハッキーです。

+0

hide()とwidget.setGeometry(pos)の前にpos = widget.geometry()とpos = widget.frameGeometry()の両方を試してみました。ウィンドウは非常に同じ位置に表示されます。 –

関連する問題