编程语言
首页 > 编程语言> > python-PyQt5端口:如何隐藏窗口并使其出现在相同位置

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