Warm tip: This article is reproduced from serverfault.com, please click

python-派赛德

(python - PySide)

发布于 2020-12-06 12:56:40

我正在学习Python,并一直在尝试解决第一个小部件上的问题,但我一直在努力。

我制作了一个带有3行8平方的QToolButton的QGridLayout。当我向上或向下缩放主窗口时,我希望网格使用最大可能的宽度,但是无论我的主窗口具有什么尺寸和比例,我都希望按钮保持正方形。

所以我想我不想在按钮上使用固定大小策略,因为我希望它们随窗口增大或缩小。但是我需要它们具有基本平方的大小和它们的比率,以始终保持不变。

因此,我还想知道是否应该在按钮上应用那些“保留比率”信息,或者直接将其应用于网格是否更好(我想说第二种选择更好,因为我只希望按钮“填充”)我的第二个询问是我是否可以仅使用一些sizePolicy来实现,或者是否需要添加一些resizeEvent。

class ColorPalette(QtWidgets.QWidget): 
   def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        
        grid_layout = QtWidgets.QGridLayout()

        self.setLayout(grid_layout)
        grid_layout.setSpacing(0)


        for x in range(3):
                for y in range(8):

                        sizepolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)

                        button = QtWidgets.QToolButton()
                        button.setSizePolicy(sizepolicy)

                        grid_layout.addWidget(button, x, y)



class MainWindow(QtWidgets.QWidget): 
   def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        self.layout = QtWidgets.QGridLayout(self)


        self.colorpalette = ColorPalette()
        self.layout.addWidget(self.colorpalette, 0, 0)



c = MainWindow()
c.show()

在这段代码中,我想对小部件进行分层,例如“可以按照我们想要的任何方式调整其大小的MainWindow”->“ ColorPalette Grid,它将遵循MainWindow的调整大小,但具有一定的比例约束”->“填充按钮细胞”

但是我在设置ColorPalette Grid大小限制方面需要一些帮助。

谢谢你的帮助!

Questioner
Rainbowrama
Viewed
0
Rainbowrama 2020-12-07 05:26:22

找到了带有resize事件的解决方案。

class ColorPalette(QtWidgets.QWidget): 
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

    def resizeEvent(self, event):

        # Define Number of Rows
        r = 3
        # Define Number of Columns
        c = 8
        # Define Button Minimum Size
        s = 10

        self.setMinimumSize(c*2*s,r*2*s)
        new_size = QtCore.QSize(c*s, r*s)
        new_size.scale(event.size(), QtCore.Qt.KeepAspectRatio)
        self.resize(new_size)
        grid = QtWidgets.QGridLayout()
        self.setLayout(grid)
        grid.setSpacing(0)


        for x in range(r):
                for y in range(c):

                        button = QtWidgets.QToolButton()

                        policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                        button.setSizePolicy(policy)
                        button.setMinimumSize(s, s)

                        grid.addWidget(button, x, y)



class MainWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
       QtWidgets.QWidget.__init__(self, parent)

       layout = QtWidgets.QHBoxLayout()
       self.custom_widget = ColorPalette()
       layout.addWidget(self.custom_widget)
       self.setLayout(layout)




c = MainWidget()
c.show()