【问题标题】:Python Widget with SizePolicy带有 SizePolicy 的 Python 小部件
【发布时间】:2022-01-26 00:01:19
【问题描述】:

为什么 sizePolicy 不会影响不在布局中的小部件?

这是一个例子:

from PyQt5 import QtWidgets

app = QtWidgets.QApplication([])
window = QtWidgets.QWidget()
window.setGeometry(50, 50, 500, 300)

test_widget = QtWidgets.QWidget(window)
test_widget.setMinimumSize(100, 100)
test_widget.setStyleSheet("background-color:red")
size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
test_widget.setSizePolicy(size_policy)


window.show()
app.exec()

但这不起作用,如果您更改了主窗口大小,红色框仍然具有相同的大小。

那么当父(主窗口)发生变化时,我怎样才能使那个红色框可以调整大小。

注意:出于某种原因我不想使用布局。

【问题讨论】:

  • “出于某种原因,我不想使用布局。”那会是什么原因呢?此外,您在不使用布局管理器的情况下设置大小策略,并且文档中的每个大小策略引用都明确提到它与布局有关:sizePolicy()(“此属性包含小部件的默认布局行为”)QSizePolicy summary(“QSizePolicy 类是一个布局属性”)及其详细描述(“小部件的大小策略 [...] 影响布局引擎如何处理小部件”)。
  • "那是什么原因?" 因为我有一个设计,我认为如果不使用以下方法就无法实现:GUI 后面应该有 Canvas(用于绘制形状) (我的意思是采用父小部件的整个大小)并且一些菜单(小部件)将位于该画布的前面。所以画布将被添加到小部件中,这些菜单将被添加到 parent_widget 的网格布局中
  • 如果我将画布添加到 GridLayout 以及菜单中,它不会占用该小部件的整个大小
  • 小部件的几何形状由布局“手动”管理,即由您自己的代码管理。因此,如果您不想使用布局,则由您决定覆盖父级的 QWidget::resizeEvent 等以相应地管理子小部件的几何形状。
  • @Moaaz 以供将来参考,请始终尝试解释为什么您正在做某事:“出于某种原因”几乎总是错误原因(事实上​​,这是你的情况),并且通常会导致提出错误的问题(参见XY problem)。另请注意,您仍然可以为“主小部件”使用布局并添加“浮动”小部件,然后您可以在 resizeEvent() 中调整大小,如上所述。一些相关的例子:stackoverflow.com/q/70350069/2001654stackoverflow.com/a/70631192/2001654

标签: python qt pyqt5 qwidget qsizepolicy


【解决方案1】:

我不确定我是否完全理解您的 GUI 设计,但您应该注意,QGridLayout 中的单个单元格(由行/列对定义)可以被多个小部件占用。一个(非常)简单的例子证明了这一点......

#!/usr/local/bin/python3
import os
import sys

from PySide2.QtWidgets import QApplication, QGridLayout, QLabel, QPushButton, QWidget
from PySide2.QtCore import Qt

class widget(QWidget):
    def __init__ (self, parent = None):
        super(widget, self).__init__(parent)
        gl = QGridLayout(self)
        pb = QPushButton("Show/Hide Menu")
        self.menu = QLabel("Menu goes here...")
        self.menu.setAlignment(Qt.AlignCenter)
        self.menu.setStyleSheet("background-color: #40800000;")
        canvas = QLabel("Canvas")
        canvas.setAlignment(Qt.AlignCenter)
        canvas.setStyleSheet("background-color: #40000080;")
        gl.addWidget(pb, 0, 0)
        gl.addWidget(canvas, 0, 0, 2, 2)
        pb.raise_()
        pb.clicked.connect(self.toggle_menu)
        gl.addWidget(self.menu, 1, 0)
        self.menu.hide()
    def toggle_menu (self, checked):
        self.menu.setVisible(not self.menu.isVisible())

if __name__ == '__main__':
    app = QApplication([])
    w = widget()
    w.show()
    app.exec_()

[我使用了PySide2,因为我没有安装PyQt5。]

所以如果我理解正确,那么我不明白为什么你不能使用QGridLayout。可以为您节省大量工作。

【讨论】:

  • 谢谢,我不知道我可以添加一个占据整个网格的单元格,我可以在上面添加其他单元格:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2021-12-05
  • 2021-08-31
相关资源
最近更新 更多