python-PyQt5端口:如何隐藏窗口并使其出现在相同位置
作者:互联网
我正在将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()之后,它将不会移回到其原始位置.在这种情况下,不需要其他技巧/解决方法.
标签:pyqt5,pyqt4,python,porting 来源: https://codeday.me/bug/20191118/2025263.html