【发布时间】:2017-02-25 17:50:57
【问题描述】:
我正在将 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 不同?
【问题讨论】:
-
在
hideMe和showMe中打印self.pos()并查看差异。 -
重点是:这里没有区别!
-
@TobiasLeupold。如果您说明您使用的是哪个 linux 发行版以及哪个窗口管理器,将会很有帮助。
标签: python pyqt4 porting pyqt5