Как отключить растягивание виджетов в PyQt6?

Я хочу, чтобы при изменении размера окна виджет QSpinBox не растягивался по горизонтали.
Я пытался использовать QtWidgets.QSizePolicy, но не нашёл достаточно информации по этому поводу.

Решить это через setFixedSize() не получается, т. к. если получить значение размера окна self.size(), то передаётся значение больше, чем на самом деле

Возможно требуется что-то из настроек самого QVBoxLayout

import sys
from PyQt6.QtWidgets import QApplication, QCheckBox, QWidget, QLabel, QVBoxLayout, QSpinBox


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.chkbx = QCheckBox('Чекбокс')
        self.text = QLabel('Текст')
        self.numb = QSpinBox()

        layout = QVBoxLayout()
        layout.totalSizeHint()
        layout.addWidget(self.chkbx)
        layout.addWidget(self.text)
        layout.addWidget(self.numb)
        self.setLayout(layout)


app = QApplication(sys.argv)
window = App()
window.show()
app.exec()


Ответы (2 шт):

Автор решения: S. Nick

Я не совсем понимаю почему вас не устраивает:

void QWidget::setFixedWidth(int w)

Устанавливает минимальную и максимальную ширину виджета в w без изменения высоты.

import sys
'''
from PyQt6.QtWidgets import QApplication, QCheckBox, QWidget, \
    QLabel, QVBoxLayout, QSpinBox
'''
from PyQt5.QtWidgets import QApplication, QCheckBox, QWidget, \
    QLabel, QVBoxLayout, QSpinBox


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.chkbx = QCheckBox('Чекбокс')
        self.text = QLabel('Текст')
        self.numb = QSpinBox()
        
        self.numb.setFixedWidth(35)                          # <----

        layout = QVBoxLayout()
# ???        layout.totalSizeHint()
        layout.addWidget(self.chkbx) 
        layout.addWidget(self.text) 
        layout.addWidget(self.numb) 
        self.setLayout(layout)


app = QApplication(sys.argv)
window = App()
window.show()
app.exec()

введите сюда описание изображения

→ Ссылка
Автор решения: Sonter

Для того, чтобы заблокировать QLayout, нужно воспользоваться методом .setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)

А если нужно заблокировать отдельный виджет, то нужно использовать метод .setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed), где первый аргумент в .setSizePolicy отвечает за изменения по горизонтали, а второй - по вертикали.

→ Ссылка