我有一个PyQt5 GUI应用程序主窗口,它根据屏幕大小设置几何图形。当我调用toogleLogWindow()
函数时,hLayoutWidget_error
的可见性属性会更改,但不会调整窗口大小。当我通过单击右上角的恢复按钮手动恢复主窗口时,调整大小功能会起作用。有人能帮我理解这种行为吗?默认情况下不检查actionToggleLogWindow
状态。
import sys, os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUI()
def setupUI(self):
# Set screen size parameters
for i in range(QApplication.desktop().screenCount()):
self.window_size = QApplication.desktop().availableGeometry(i).size()
self.resize(self.window_size)
self.move(QPoint(0, 0))
self._button = QtWidgets.QPushButton(self)
self._button.setText('Test Me')
self._editText = QtWidgets.QComboBox(self)
self._editText.setEditable(True)
self._editText.addItem("")
self._editText.setGeometry(QtCore.QRect(240, 40, 113, 21))
# Connect signal to slot
self._button.clicked.connect(self.toogleLogWindow)
def toogleLogWindow(self):
if self._editText.currentText() == "0":
h = self.window_size.height()
w = int(self.window_size.width()/2)
self.resize(w,h)
elif self._editText.currentText() == "1":
h = self.window_size.height()
w = int(self.window_size.width())
self.resize(w,h)
else:
pass
def get_main_app(argv=[]):
app = QApplication(argv)
win = MainWindow()
win.show()
return app, win
def main():
app, _win = get_main_app(sys.argv)
return app.exec_()
if __name__ == '__main__':
sys.exit(main())
需要注意的是:
-
如果在显示之前设置窗口的最大大小,然后再显示,则相当于最大化窗口。
-
当窗口最大化时,除非将其恢复到以前的状态,否则无法更改其大小。例如,如果手动更改窗口的大小,直到它处于正常状态,则可以只更改大小。
因此,对于这种情况,有几种替代方案:
-
不要设置屏幕的全尺寸:
self.window_size = QApplication.desktop().availableGeometry(i).size() - QSize(10, 10)
-
显示后设置大小:
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUI() def setupUI(self): # Set screen size parameters for i in range(QApplication.desktop().screenCount()): self.window_size = QApplication.desktop().availableGeometry(i).size() self._button = QPushButton(self) self._button.setText("Test Me") self._editText = QComboBox(self) self._editText.setEditable(True) self._editText.addItem("") self._editText.setGeometry(QRect(240, 40, 113, 21)) # Connect signal to slot self._button.clicked.connect(self.toogleLogWindow) def init_geometry(self): self.resize(self.window_size) self.move(QPoint(0, 0)) def toogleLogWindow(self): if self._editText.currentText() == "0": h = self.window_size.height() w = int(self.window_size.width() / 2) self.resize(w, h) elif self._editText.currentText() == "1": h = self.window_size.height() w = int(self.window_size.width()) self.resize(w, h) else: pass def get_main_app(argv=[]): app = QApplication(argv) win = MainWindow() win.show() win.init_geometry() return app, win