Question

I'm writing simple calculator by using PyQt. In my code I'm using QGridLayout to compound widgets. But there is a problem. I can't find a way to resize widgets. I tryed to using QWidget.resize and insertStreach, but it's does not work like i need to. Which function can substitute 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_())
Was it helpful?

Solution

See QWidget::sizePolicy:

Button-like widgets set the size policy to specify that they may stretch horizontally, but are fixed vertically.

In order to make the buttons also resize vertically, you need to modify the size policy of your buttons:

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)))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top