如何在 PyQt5(QGridLayout) 中调整小部件的大小

问题描述 投票:0回答:1

我有一个问题。我开始学习PyQt5,我想做一个计算器。于是我学会了如何充满激情 我的小部件带有QGridLayout,但我无法更改小部件的大小。有些小部件比其他小部件大,我不明白这一点。我尝试了不同的方法,例如(调整大小,setGeometry),但它不起作用。我还想调整 QLineEdit 变量的大小,但我不能。这是我的问题的代码和图片:

import PyQt5.QtWidgets as qwd
import PyQt5.QtGui as qtg

class CreateWindow(qwd.QWidget):
    # create window
    def __init__(self):
        super().__init__()
        
        self.setWindowTitle('calculator')
        self.setWindowIcon(qtg.QIcon('calculator.png'))
        self.setStyleSheet('background: #FAEBD7;')
        # self.setFixedWidth(300)
        # self.setFixedHeight(170)

        # show result
        self.text = '0'

        self.UIcomponents()

        self.show()

    def UIcomponents(self):
        # layout

        grid = qwd.QGridLayout()
        

        # show numbers
        self.resultText = qwd.QLineEdit(self.text)
        self.resultText.setReadOnly(True)
        self.resultText.setStyleSheet('background: #FFFAFA;')

        # buttons
        self.but9 = qwd.QPushButton('9')
        self.but8 = qwd.QPushButton('8')
        self.but7 = qwd.QPushButton('7')
        self.but6 = qwd.QPushButton('6')
        self.but5 = qwd.QPushButton('5')
        self.but4 = qwd.QPushButton('4')
        self.but3 = qwd.QPushButton('3')
        self.but2 = qwd.QPushButton('2')
        self.but1 = qwd.QPushButton('1')
        self.but0 = qwd.QPushButton('0')
        self.but_add = qwd.QPushButton('+')
        self.but_decreas = qwd.QPushButton('-')
        self.but_multiply = qwd.QPushButton('*')
        self.but_devide = qwd.QPushButton('/')     
        self.but_equal = qwd.QPushButton('=')

        # positionate the buttons
        grid.addWidget(self.resultText, 0, 0)
        grid.addWidget(self.but9, 1, 2)
        grid.addWidget(self.but8, 1, 1)
        grid.addWidget(self.but7, 1, 0)
        grid.addWidget(self.but6, 2, 2)
        grid.addWidget(self.but5, 2, 1)
        grid.addWidget(self.but4, 2, 0)
        grid.addWidget(self.but3, 3, 2)
        grid.addWidget(self.but2, 3, 1)
        grid.addWidget(self.but1, 3, 0)
        grid.addWidget(self.but0, 4, 0)

        # buttons for operation
        self.but_devide.setStyleSheet('background: #7FFFD4')
        grid.addWidget(self.but_devide, 1, 4)
        self.but_multiply.setStyleSheet('background: #7FFFD4')
        grid.addWidget(self.but_multiply, 2, 4)
        self.but_add.setStyleSheet('background: #7FFFD4')
        grid.addWidget(self.but_add, 3, 4)
        self.but_decreas.setStyleSheet('background: #7FFFD4')
        grid.addWidget(self.but_decreas, 4, 4)
        self.but_equal.setStyleSheet('background: #008B8B')
        grid.addWidget(self.but_equal, 4, 2)

        # connect buttons
        self.but9.clicked.connect(lambda state, number = '9': self.show_result(number))
        self.but8.clicked.connect(lambda state, number = '8': self.show_result(number))
        self.but7.clicked.connect(lambda state, number = '7': self.show_result(number))
        self.but6.clicked.connect(lambda state, number = '6': self.show_result(number))
        self.but5.clicked.connect(lambda state, number = '5': self.show_result(number))
        self.but4.clicked.connect(lambda state, number = '4': self.show_result(number))
        self.but3.clicked.connect(lambda state, number = '3': self.show_result(number))
        self.but2.clicked.connect(lambda state, number = '2': self.show_result(number))
        self.but1.clicked.connect(lambda state, number = '1': self.show_result(number))
        self.but0.clicked.connect(lambda state, number = '0': self.show_result(number))
        self.but_decreas.clicked.connect(lambda state, oper = '-': self.chose_oper(oper))
        self.but_add.clicked.connect(lambda state, oper = '+': self.chose_oper(oper))
        self.but_multiply.clicked.connect(lambda state, oper = '*': self.chose_oper(oper))
        self.but_devide.clicked.connect(lambda state, oper = '/': self.chose_oper(oper))

        self.setLayout(grid)

    def show_result(self, number):
        if len(self.text) != 20:
            print(len(self.text))
            if self.text[0] == '0':
                self.text = ''
            self.text += number
            self.resultText.setText(str(self.text))
            
    def chose_oper(self, oper):
        if self.text[0] != '0':
                self.text += oper
        self.resultText.setText(str(self.text))

def create_app():
    app = qwd.QApplication([])
    wind = CreateWindow()
    # set app style
    app.setStyle('Fusion')

    app.exec_()

create_app()

python layout pyqt5 widget qgridlayout
1个回答
2
投票

tl;博士

将小部件添加到网格布局时,选择适当的列跨度:

grid.addWidget(self.resultText, 0, 0, 1, 5)
说明

布局管理器的重点在于它管理布局

基于设置它的小部件及其管理的所有项目(小部件甚至其他嵌套布局),考虑所有约束(可能的最小/最大尺寸),

提示(首选尺寸)和尺寸策略(如果以及如何调整小部件的大小),然后它决定这些项目应该放置在哪里以及它们有多大。

考虑到所有这些,您可以理解尝试手动调整这些小部件的大小是没有意义的,因为布局会尽快覆盖它

1

大多数小部件将根据其

sizeHint 建议尝试占用布局所提供的尽可能多的空间,如果有更多空间可用,他们 可能 尝试使用它。这是按钮宽度的情况,但不是它们的高度(通常是固定的)。

当窗口被

映射(第一次显示)时,布局会考虑上述所有内容,包括大小提示,并尝试使用允许尊重所有这些提示的大小。事实上,如果您尝试将窗口调整到尽可能小的尺寸,您会发现所有按钮(和行编辑)很可能会获得相同的尺寸。

您正在使用

grid布局,它允许将项目放入网格的cells中:行和列。由于您将 QLineEdit 放在第一列中,并且该小部件的默认尺寸提示比按钮宽,因此结果是,当第一次显示窗口时,第一列将使用该宽度,并且由于按钮会调整其宽度以适应可用空间,第一列中的那些将显示与行编辑一样宽。

网格布局允许使用

spanning(请参阅文档,这是一种让项目占据多个单元格行和/或列的方法。考虑到程序的目的,如果该行编辑可能看起来更好占据了整个水平空间,并且由于您使用了 5 列(操作按钮位于第 4 列,索引始终从 0 开始),这就是我们得到上面一行的方式:

grid.addWidget(self.resultText, 0, 0, 1, 5)
即:将小部件添加到第 0 行第 0 列,并使其仅占据一行五列。

如果未给出跨度参数,则它们隐式仅占用一行和一列。请注意,即使您只对一个跨度“方向”感兴趣,
两个跨度参数都是必需的(它们不是关键字参数)。

1 可以使用

resize
setGeometry
布局完成其工作之后;但尝试这样做没有什么意义:一旦以任何方式(从用户或系统)调整窗口大小,布局就会覆盖这些手动尝试。如果您尝试在显示窗口之前执行此操作,就会发生这种情况:第一次显示小部件时,它还会收到一个 resize 事件,如果该小部件有布局,它会自动通知该布局,以便它可以执行所有计算。

ADDENDUM,例如问题

使用

grid.addWidget(self.resultText, 0, 0)

grid.addWidget(self.resultText, 0, 0, 1, 3)
,在开始时输出:

enter image description here 尝试调整大小

grid.addWidget(self.resultText, 0, 0)

enter image description here

grid.addWidget(self.resultText, 0, 0, 1, 3)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.