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() 设置它?可能有点hacky..

于 2012-11-19T21:39:54.157 回答