Почему PyQt QGridLayout не меняет размер?

Я пишу простой калькулятор с помощью PyQt. В моем коде я использую QGridLayout для составления виджетов. Но есть проблема. Я не могу найти способ изменить размер виджетов. Я пытался использовать QWidget.resize и insertStreach, но он не работает так, как мне нужно. Какая функция может заменить QWidget.resize?

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Button(QPushButton):
    def __init__(self, text, parent, TextObject):
        super().__init__(text, parent=parent or None)
        self.clicked.connect(TextObject.SLOT_TextInsert('%s' %(text)))

class Text(QLineEdit):
    def __init__(self, parent):
        super().__init__(parent=parent)
        self.show()

    def SLOT_TextInsert(self, text):
        return lambda: self.insert('%s' %(text))

    def SLOT_TextGet(self):
        text = self.text()

if __name__ == '__main__':
    app = QApplication(sys.argv)

    root = QWidget()
    text = Text(root) 
    plus = Button('+', root, text)
    minus = Button('-', root, text)
    multiple = Button('*', root, text)
    divide = Button('/', root, text)
    null = Button('0', root, text)
    dot = Button('.', root, text)
    equal = Button('=', root, text)
    clean = Button('Ce', root, text)

    layout = QGridLayout(root)
    layout.setSpacing(2)
    layout.addWidget(text, 1, 1, 1, 5)
    layout.addWidget(plus, 2, 4)
    layout.addWidget(minus, 2, 5)
    layout.addWidget(multiple, 3, 4)
    layout.addWidget(divide, 3, 5)
    layout.addWidget(clean, 4, 4, 1, 2)
    layout.addWidget(null, 5, 1, 1, 2)
    layout.addWidget(dot, 5, 3)
    layout.addWidget(equal, 5, 4, 1, 2)

    num_list = list()
    row=2; col=1
    for i in range(0,9):
        num_list.append(Button('%s' %(i+1), root, text))
        layout.addWidget(num_list[i], row, col )
        col = col+1
        if i == 2 or i == 5:
            col = 1; row = row+1

    root.resize(10,10)
    root.show()        
    sys.exit(app.exec_())

1 ответ

Решение

Смотрите QWidget:: sizePolicy:

Подобные кнопкам виджеты устанавливают политику размера, чтобы указать, что они могут растягиваться по горизонтали, но фиксироваться по вертикали.

Чтобы кнопки также изменяли размер по вертикали, вам нужно изменить политику размеров ваших кнопок:

class Button(QPushButton):
    def __init__(self, text, parent, TextObject):
        super().__init__(text, parent=parent or None)
        self.setSizePolicy ( QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.clicked.connect(TextObject.SLOT_TextInsert('%s' %(text)))
Другие вопросы по тегам