gpt4 book ai didi

python - PyQt5 端口 : how do I hide a window and let it appear at the same position

转载 作者:行者123 更新时间:2023-11-28 16:21:20 25 4
gpt4 key购买 nike

我正在将 PyQt4 程序移植到 PyQt5。其中一部分是隐藏窗口,截取窗口后面区域的屏幕截图并再次显示窗口,这在 PyQt4 上工作得很好。

使用我的 PyQt5 端口,一切正常,但窗口出现在程序启动时的位置,而不是调用 hide() 方法之前的位置。

我正在 Linux 机器上对此进行测试。相关代码精简为:

import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget,
QGridLayout, QPushButton)

class demo(QMainWindow):

def __init__(self):
super().__init__()

mainWidget = QWidget(self)
layout = QGridLayout(mainWidget)
self.setCentralWidget(mainWidget)

self.testButton = QPushButton(self)
self.testButton.setText('Test')
self.testButton.clicked.connect(self.hideMe)
layout.addWidget(self.testButton, 0, 0)

def hideMe(self):
self.hide()
QTimer.singleShot(300, self.showMe)

def showMe(self):
self.show()
self.move(self.pos())

app = QApplication(sys.argv)
mainWindow = demo()
mainWindow.show()
sys.exit(app.exec_())

在 showMe() 中,self.pos() 实际上包含正确的坐标,但窗口并没有移动到那里(但是它在开始后的“原始”位置)。

当我 e. G。相反,做一个 self.move(10, 10) ,窗口实际上被移动到那里。但是一旦我使用一个变量(我也尝试将 self.pos 的 x 和 y 保存在一个变量中并改为使用它),窗口就会显示在它开始后的位置。

为什么使用整数的 move() 调用实际上移动了窗口,而使用变量的 move() 调用却没有?如何将窗口移动到隐藏前的位置?

感谢大家的帮助!

编辑(也许是为了找出不同之处):

使用 PyQt4 的完全相同的代码可以工作:

import sys

from PyQt4.QtCore import QTimer
from PyQt4.QtGui import (QApplication, QMainWindow, QWidget,
QGridLayout, QPushButton)

class demo(QMainWindow):

def __init__(self):
super().__init__()

mainWidget = QWidget(self)
layout = QGridLayout(mainWidget)
self.setCentralWidget(mainWidget)

self.testButton = QPushButton(self)
self.testButton.setText('Test')
self.testButton.clicked.connect(self.hideMe)
layout.addWidget(self.testButton, 0, 0)

def hideMe(self):
self.hide()
QTimer.singleShot(300, self.showMe)

def showMe(self):
self.show()
self.move(self.pos())

app = QApplication(sys.argv)
mainWindow = demo()
mainWindow.show()
sys.exit(app.exec_())

那么在这种情况下,为什么 Qt5 的行为与 Qt4 不同?

最佳答案

似乎在 Qt5 中,如果几何形状完全相同,则不会重新设置 - 但我不知道为什么这种行为发生了变化,或者它是否是一个错误。请注意,受影响的不仅仅是位置 - 调整大小也会被忽略。

这里有一个解决这个问题的技巧:

from PyQt5.QtCore import QMargins

class demo(QMainWindow):
...

def hideMe(self):
print('hide:', self.geometry())
self.hide()
QTimer.singleShot(300, self.showMe)

def showMe(self):
print('show1:', self.geometry())
hack = QMargins(0, 0, 0, 1)
self.setGeometry(self.geometry() + hack)
self.show()
self.setGeometry(self.geometry() - hack)
print('show2:', self.geometry())

更新:

经过进一步调查,似乎有一个更简单的解决方案。如果在首次显示窗口之前显式设置了窗口的几何形状,则在随后的 hide()/show() 之后它不会移回其原始位置。在这种情况下,不需要其他黑客/解决方法。

关于python - PyQt5 端口 : how do I hide a window and let it appear at the same position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40074637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com