Python 如果用户调整了窗口的大小,如何使窗口中的Qt小部件自动扩展其大小?

Python 如果用户调整了窗口的大小,如何使窗口中的Qt小部件自动扩展其大小?,python,pyqt,Python,Pyqt,我看到了一个解决方案,如果每个小部件都在一个布局上,但在我的程序中,我没有使用任何布局。如果我调整程序窗口的大小,如何使QPushButtons和Qlabel自动调整大小 一些代码: from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QLabel from PyQt5 import QtCore import sys class Window(QMainWindow): def __init__(se

我看到了一个解决方案,如果每个小部件都在一个布局上,但在我的程序中,我没有使用任何布局。如果我调整程序窗口的大小,如何使QPushButtons和Qlabel自动调整大小

一些代码:

from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QLabel
from PyQt5 import QtCore
import sys

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Resizable Widgets")
        self.setGeometry(500, 200, 300, 100)

        self.UiComponents()

        self.show()

    def UiComponents(self):
        label = QLabel("Label", self)
        label.setGeometry(0, 0, 300, 50)
        label.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)

        button = QPushButton("Button", self)
        button.setGeometry(100, 50, 100, 40)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    sys.exit(App.exec_())

如果不使用布局,它可能如下所示:

import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QLabel
from PyQt5 import QtCore


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Resizable Widgets")
#        self.setGeometry(500, 200, 300, 100)

        self.w = 300
        self.h = 100
        self.resize(self.w, self.h)
        self.setMinimumSize(self.w/2, self.h/2)        
        self.widthFactor  = 1
        self.heightFactor = 1

        self.UiComponents()

    def UiComponents(self):
        self.label = QLabel("Label", self)
#        label.setGeometry(0, 0, 300, 50)
        self.label.setStyleSheet("font: {}pt Arial;".format(20*self.heightFactor))
        self.label.resize(self.w*self.widthFactor, self.h*0.25*self.heightFactor) 
        self.label.setAlignment(QtCore.Qt.AlignCenter) # | QtCore.Qt.AlignVCenter)

        self.button = QPushButton("Button", self)
#        button.setGeometry(100, 50, 100, 40)
        self.button.resize(self.w*0.25*self.widthFactor, self.h*0.2*self.heightFactor)

    def resizeEvent(self, event):
        self.widthFactor  = self.rect().width() / 300
        self.heightFactor = self.rect().height()/ 100        

        self.label.resize(self.w*self.widthFactor, self.h*0.25*self.heightFactor)
        self.label.move(self.rect().center() - self.label.rect().center() - QtCore.QPoint(0, self.h/4*self.heightFactor))
        self.label.setStyleSheet("font: {}pt Arial;".format(20*self.heightFactor))

        self.button.resize(self.w*0.25*self.widthFactor, self.h*0.2*self.heightFactor)
        self.button.move(self.rect().center() - self.button.rect().center() - QtCore.QPoint(0, -self.h*0.3*self.heightFactor))
        super(Window, self).resizeEvent(event)

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(App.exec_())


等待10分钟如果我没有要求链接,请将问题中的MRE作为一个版本发布。阅读@CugureanuChiril你肯定已经回答了你自己的问题:使用布局。不使用布局是一个非常常见的新手错误。首先,它看起来很简单,但很快就会使许多事情变得比需要的复杂得多。如果你现在花一点时间学习如何正确使用布局,从长远来看,你会得到很大的回报。好的,但是有人能在我的代码中给我展示一下布局的实现吗?非常感谢@S.Nick。这有助于我更好地理解Python。再次感谢兄弟!