如何使小部件随 PyQt5 中的窗口缩放?

Posted

技术标签:

【中文标题】如何使小部件随 PyQt5 中的窗口缩放?【英文标题】:How to make widgets scale with the window in PyQt5? 【发布时间】:2019-01-05 19:03:34 【问题描述】:

我正在尝试设置一个 GUI,它将在 PyQt5 中包含多个页面。该窗口的最小尺寸为 800x600,但可以自定义。我希望窗口上的大多数(但不是全部)元素与它一起缩放。我已经有了解决方案,但感觉不是很优雅。

以下是 800x600 的窗口示例:

这是缩放后的另一个例子

我尝试过使用 QVBoxLayout,但使用该系统,我无法保持布局原样(并不是说不可能),而是所有小部件都居中并具有相同的宽度。稍后,我可能还会考虑将小部件添加到与某些现有小部件具有相同 y 值的一侧,这是我不确定如何处理框布局的另一件事.

以下是相关代码:

class CreatePage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.homeBtn = QPushButton("Home", self)
        self.homeBtn.move(10, 10)

        self.frontLabel = QLabel("Front", self)
        self.frontLabel.setFont(QFont("Decorative", 20))

        self.frontEdit = QTextEdit(self)
        self.frontEdit.setFont(QFont("Decorative", 11))

        self.backLabel = QLabel("Back", self)
        self.backLabel.setFont(QFont("Decorative", 20))

        self.backEdit = QTextEdit(self)
        self.backEdit.setFont(QFont("Decorative", 11))

    def paintEvent(self, e):
        qp = QPainter()
        qp.setFont(QFont("Decorative", 20))

        size = self.size()
        h = size.height()
        w = size.width()

        frontW = qp.fontMetrics().width("Front")
        self.frontLabel.move((w/2) - (frontW/2) , h/15)
        #I use fontMetrics to determine the width of the text
        #I then use this information to centre the text

        self.frontEdit.move(50, h/15 + 40)
        self.frontEdit.resize(w-100, h/3)

        backW = qp.fontMetrics().width("Back")
        self.backLabel.move((w/2) - (backW/2), h/2)

        self.backEdit.move(50, h/2 + 40)
        self.backEdit.resize(w-100, h/3)

对于任何一般的草率道歉,我是 PyQt 和整个 GUI 编程的新手。无论如何,我用来调整大小和移动小部件的公式是相当随意的。有谁知道实现这种效果的更好方法?

【问题讨论】:

【参考方案1】:

试试看:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *

class CreatePage(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.homeBtn = QPushButton("Home") 

        self.frontLabel = QLabel("Front") 
        self.frontLabel.setFont(QFont("Decorative", 20))
        self.frontEdit = QTextEdit(placeholderText="frontEdit") 
        self.frontEdit.setFont(QFont("Decorative", 11))

        self.backLabel = QLabel("Back") 
        self.backLabel.setFont(QFont("Decorative", 20))
        self.backEdit = QTextEdit(placeholderText="backEdit") 
        self.backEdit.setFont(QFont("Decorative", 11))

        grid = QGridLayout()
        grid.addWidget(self.homeBtn,    0, 0, alignment=Qt.AlignTop | Qt.AlignLeft)
        grid.addWidget(self.frontLabel, 1, 0, alignment=Qt.AlignCenter)
        grid.addWidget(self.frontEdit,  2, 0)
        grid.addWidget(self.backLabel,  3, 0, alignment=Qt.AlignCenter)
        grid.addWidget(self.backEdit,   4, 0)

        self.setLayout(grid)

if __name__=="__main__":
    app = QApplication(sys.argv)
    myapp = CreatePage()
    myapp.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于如何使小部件随 PyQt5 中的窗口缩放?的主要内容,如果未能解决你的问题,请参考以下文章

使用tkinter.pack()始终使小部件居中

如何使小部件填充列中的剩余空间

如何在kivy的gridlayout中使小部件跨越多个列/行

Qt Designer 使小部件在布局中与另一个小部件重叠

如何使小部件的高度最多为 X 像素?

如何在不影响 Pyqt5 中的小部件的情况下将背景图像添加到主窗口