如何阻止自定义小部件在PyQt5中扩展?

2024-09-29 02:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个包含许多其他小部件的小部件,但我在调整窗口大小方面一直存在问题:即使我“告诉”它不要,小部件也会不断扩展。以下是我的最简单的例子:

from PyQt5 import QtWidgets, QtGui, QtCore

class CustomWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.layout  = QtWidgets.QGridLayout()
        self.button1 = QtWidgets.QPushButton("Button A")
        self.button2 = QtWidgets.QPushButton("Button B")
        self.label1  = QtWidgets.QLabel("Long label that can span multiple columns")

        self.layout.addWidget(self.button1, 0, 0)
        self.layout.addWidget(self.button2, 0, 1)
        self.layout.addWidget(self.label1, 1, 0, 1, 2)
        self.setLayout(self.layout)


class App(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.cw = CustomWidget()
        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.cw)

        self.setLayout(self.layout)
        self.show()

QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("Fusion"))
app = QtWidgets.QApplication([])
win = App()
status = app.exec_()

但是,如果我调整窗口的大小,那么所有的按钮和标签就会分散在屏幕上,这不是我想要的

我试过:

  • 设置固定大小:不起作用,因为标签文本可以有不同的长度,我希望小部件相应地调整大小(但尽量保持小)

  • self.setFixedSize(self.size())什么也没做,有时会让事情变得更糟

  • self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)或任何其他大小策略似乎都不起作用

TL;DR我希望我的小部件缩小,即使有空的空间,但我不想设置固定的大小

编辑:

我通过将alignment=QtCore.Qt.AlignLeft传递给所有self.layout.addWidget调用,部分地解决了这个问题。这并不能完全解决问题,但可能是朝着正确方向迈出的一步


Tags: selfinit部件defbuttonclasslayoutsuper
3条回答

如果希望使这些小部件尽可能小,可以向布局中添加行和列拉伸,设置为行/列索引大于使用的最右下角布局坐标

在本例中,您有两行两列,因此足以设置第三行和第三列的拉伸:

    self.layout.setColumnStretch(2, 1)
    self.layout.setRowStretch(2, 1)

显然,您可以将其设置为非常高的索引,这样,如果您必须添加更多的小部件,您就不必关心它

如果要将这些小部件保持在中间,只需从第二行和第二列开始添加它们,并为第一行/第二列设置行/列拉伸:

    self.layout.setColumnStretch(0, 1)
    self.layout.setRowStretch(0, 1)
    self.layout.addWidget(self.button1, 1, 1)
    self.layout.addWidget(self.button2, 1, 2)
    self.layout.addWidget(self.label1, 2, 1, 1, 2)
    self.layout.setColumnStretch(3, 1)
    self.layout.setRowStretch(3, 1)

注意,您也可以使用大小策略,但必须使用Maximum,而不是Minimum,并且还需要添加具有正确对齐方式的小部件

我也有同样的问题。我通过将最小和最大大小的值设置为等于100来解决这个问题

如果要缩小小部件,请将“最小值”设置为0,并将“最大值”设置为所需大小,以启动显示。它不会膨胀而是收缩

从您描述的内容来看,您似乎只是不想使用布局

制作一个具有布局的小部件,以容纳按钮和标签。将此小部件放置在主窗口中而不使用布局,而使用setGeometry放置

像这样的,

from PyQt5 import QtWidgets, QtGui, QtCore

class CustomWidget(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400, 100)
        
        # Create a widget to hold your buttons
        self.fixwidget = QtWidgets.QWidget(self)
        
        self.layout  = QtWidgets.QGridLayout()
        self.button1 = QtWidgets.QPushButton("Button A")
        self.button2 = QtWidgets.QPushButton("Button B")
        self.label1  = QtWidgets.QLabel("Long label that can span multiple columns")

        self.layout.addWidget(self.button1, 0, 0)
        self.layout.addWidget(self.button2, 0, 1)
        self.layout.addWidget(self.label1, 1, 0, 1, 2)
        
        # set the layout inside the widget
        self.fixwidget.setLayout(self.layout) 
        
        # place the widget with setGeometry
        height = self.fixwidget.sizeHint().height()
        width = self.fixwidget.sizeHint().width()
        xpos, ypos = 5, 5
        self.fixwidget.setGeometry(QtCore.QRect(xpos, ypos, width, height))


QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("Fusion"))
app = QtWidgets.QApplication([])
win = CustomWidget()
win.show()
status = app.exec_()

请注意,在大多数情况下,不建议使用布局,因为这样会使管理窗口更加困难

相关问题 更多 >