Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将网格布局小部件保持为方形_Python_Pyside6 - Fatal编程技术网

Python 将网格布局小部件保持为方形

Python 将网格布局小部件保持为方形,python,pyside6,Python,Pyside6,这应该很容易,但我只是越来越困惑地看着不起作用的建议答案。我想做的就是能够在网格布局中有一堆小部件,其中调整窗口大小将导致网格内的小部件调整大小,以尽可能填充空间,但保留其纵横比(在本例中为正方形,因为它是2x2的正方形网格) 这是没有任何失败尝试的代码。我最初计划将窗口本身限制为一个固定的纵横比,但也无法实现。我将接受具有此功能的框架(或其他小部件/布局)。限制正方形大小并不重要,只要它随窗口拉伸和收缩,同时保留正方形内容。我在这里使用PySide6,但是使用PyQt5的解决方案就可以了。C+

这应该很容易,但我只是越来越困惑地看着不起作用的建议答案。我想做的就是能够在网格布局中有一堆小部件,其中调整窗口大小将导致网格内的小部件调整大小,以尽可能填充空间,但保留其纵横比(在本例中为正方形,因为它是2x2的正方形网格)

这是没有任何失败尝试的代码。我最初计划将窗口本身限制为一个固定的纵横比,但也无法实现。我将接受具有此功能的框架(或其他小部件/布局)。限制正方形大小并不重要,只要它随窗口拉伸和收缩,同时保留正方形内容。我在这里使用PySide6,但是使用PyQt5的解决方案就可以了。C++,虽然不是那么多,但我很识字。是否需要自定义调整大小的处理?我似乎无法获得工作的高度

import sys
from PySide6.QtWidgets import QApplication, QDialog, QWidget, QFrame, QGridLayout


class MyDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(600, 600)
        self.my_frame = QFrame(self)
        self.my_frame.setObjectName(u"my_frame")
        self.my_frame.setGeometry(50, 50, 250, 250)
        self.my_frame.setBaseSize(100, 100)
        self.gridLayout = QGridLayout(self.my_frame)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")

        self.top_left = QWidget(self.my_frame)
        self.top_left.setObjectName("top_left")
        self.top_left.setStyleSheet("background-color: rgb(235, 10, 30)")
        self.gridLayout.addWidget(self.top_left, 0, 0, 1, 1)

        self.top_right = QWidget(self.my_frame)
        self.top_right.setObjectName("top_right")
        self.top_right.setStyleSheet("background-color: rgb(55, 122, 70)")
        self.gridLayout.addWidget(self.top_right, 0, 1, 1, 1)

        self.bottom_left = QWidget(self.my_frame)
        self.bottom_left.setObjectName("bottom_left")
        self.bottom_left.setStyleSheet("background-color: rgb(55, 122, 190)")
        self.gridLayout.addWidget(self.bottom_left, 1, 0, 1, 1)

        self.bottom_right = QWidget(self.my_frame)
        self.bottom_right.setObjectName("bottom_right")
        self.bottom_right.setStyleSheet("background-color: rgb(235, 219, 70)")
        self.gridLayout.addWidget(self.bottom_right, 1, 1, 1, 1)


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

qlayout(如QGridLayout)是大小处理程序,不是可视元素,因此没有必要说它们是方形的。另一方面,QGridLayout主要根据容器的大小建立小部件的几何结构

因此,在这种情况下,必须根据窗口的大小使其具有方形外观,因此为此,必须重写resizeEvent方法并计算窗口中内切的最大正方形的大小。也许你也应该把容器放在中心

类MyDialog(QDialog):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
自我调整大小(600600)
qss=“”
#左上角{
背景色:rgb(235、10、30)
}
#右上角{
背景色:rgb(55、122、70)
}
#左下角{
背景色:rgb(55122190)
}
#右下角{
背景色:rgb(235、219、70)
}
"""
自我设置样式表(qss)
self.my\u frame=QFrame(self,objectName=“my\u frame”)
self.gridLayout=QGridLayout(self.my_frame,objectName=“gridLayout”)
self.gridLayout.setspace(0)
self.top\u left=QWidget(objectName=“top\u left”)
self.gridLayout.addWidget(self.top_左、0、0、1、1)
self.top\u right=QWidget(objectName=“top\u right”)
self.gridLayout.addWidget(self.top\u right,0,1,1)
self.bottom\u left=QWidget(objectName=“bottom\u left”)
self.gridLayout.addWidget(self.bottom_left,1,0,1,1)
self.bottom\u right=QWidget(objectName=“bottom\u right”)
self.gridLayout.addWidget(self.bottom\u right,1,1,1)
def resizeEvent(自我,事件):
super().resizeEvent(事件)
l=min(self.width(),self.height())
中心=self.rect().center()
rect=QRect(0,0,l,l)
矩形移动中心(中心)
self.my_frame.setGeometry(rect)
qlayout(像QGridLayout一样)是大小处理程序,不是可视元素,因此没有必要说它们是方形的。另一方面,QGridLayout主要根据容器的大小建立小部件的几何结构

因此,在这种情况下,必须根据窗口的大小使其具有方形外观,因此为此,必须重写resizeEvent方法并计算窗口中内切的最大正方形的大小。也许你也应该把容器放在中心

类MyDialog(QDialog):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
自我调整大小(600600)
qss=“”
#左上角{
背景色:rgb(235、10、30)
}
#右上角{
背景色:rgb(55、122、70)
}
#左下角{
背景色:rgb(55122190)
}
#右下角{
背景色:rgb(235、219、70)
}
"""
自我设置样式表(qss)
self.my\u frame=QFrame(self,objectName=“my\u frame”)
self.gridLayout=QGridLayout(self.my_frame,objectName=“gridLayout”)
self.gridLayout.setspace(0)
self.top\u left=QWidget(objectName=“top\u left”)
self.gridLayout.addWidget(self.top_左、0、0、1、1)
self.top\u right=QWidget(objectName=“top\u right”)
self.gridLayout.addWidget(self.top\u right,0,1,1)
self.bottom\u left=QWidget(objectName=“bottom\u left”)
self.gridLayout.addWidget(self.bottom_left,1,0,1,1)
self.bottom\u right=QWidget(objectName=“bottom\u right”)
self.gridLayout.addWidget(self.bottom\u right,1,1,1)
def resizeEvent(自我,事件):
super().resizeEvent(事件)
l=min(self.width(),self.height())
中心=self.rect().center()
rect=QRect(0,0,l,l)
矩形移动中心(中心)
self.my_frame.setGeometry(rect)

PyQt5与PySide6不同,首先PyQt5是Qt5的绑定,PySide6是Qt6的绑定,Qt5与Qt6不同(Qt6与Qt5相比有很多bug和默认行为变化)。另外,两个绑定都使用不同的工具来构建:sip和shiboken。因此,请不要同时使用这两个标记。@Eylandesc请停止从问题中删除对PyQt的引用。通过限制PySide或PyQt来限制潜在答案是没有意义的。我对这两个问题的答案都很满意。我本可以用PyQt5导入来轻松地提出这个问题。我非常感谢您对我的问题的回答,但我不理解您在这里的态度。您说“在许多情况下,解决方案可能对两个库都有效,但对其他库无效”——这意味着不同的解决方案将帮助社区的不同成员,因此在一个环境中工作的人可能会选择切换以克服另一个环境中的问题。信息越多越好