6

PyQt4を使用して、ウィンドウを非表示にして後で表示すると、別の位置に表示されます(少なくともここではLinuxの場合)。コード例:

#!/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_()

ウィンドウが消えて表示されますが、元の位置の少し下と右にあります。実際のウィジェットの周りのウィンドウマネージャーのフレームのサイズによって置き換えられていると思います。

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

4

2 に答える 2

2

Linuxでは、ウィンドウの配置は非常に予測できない場合があります。問題の内訳については、Qtドキュメントのこのセクションを参照してください。

この問題に対する一般的な解決策はおそらくありませんが、私にとっては、イニシャルのshow()にジオメトリを設定することは機能しているようです。

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

アップデート

KDEウィンドウマネージャーでいくつかテストした後、私は潜在的な解決策を発見したかもしれません。

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を使用している私にとっては機能しますが、もちろんYMMVです。

于 2012-11-20T20:15:11.873 に答える
0

xfceでも同様の問題がありました。おそらく、非表示にする前に(または、必要に応じて表示するときに)位置を取得し、それを保存してから、setGeometry() を使用して再度表示するときに設定できますか? おそらく少しハック..

于 2012-11-19T21:39:54.157 に答える