Примечание: я использую Python 3.6.2 и PyQt5, хотя логика в этом примере остается той же и понятной, даже если вы используете другие версии Python и PyQt.
Посмотрите, что здесь сказано :
Если вы укажете размер 0, виджет будет невидимым. Политика размеров виджетов сохраняется.То есть значение, которое меньше подсказки минимального размера соответствующего виджета, будет заменено значением подсказки.
Один из вариантов решения вашей проблемы - вызвать * 1015.* с небольшим значением, например:
x.setMinimumWidth(1)
Однако, если вы попробуете это сами, вы увидите, что
- это грязный хак, так как он фактически уходитвиджет здесь просто делает его очень узким и
- , хотя теперь вы можете перетаскивать разделитель, начальная ширина виджета по-прежнему «32» вместо «20».
x.setMinimumWidth(0)
также не работает должным образом: его минимальная ширина фактически равна нулю по умолчанию (так как у этого виджета нет содержимого, я полагаю), ноэто не поможет вам сделать элемент разделителя шириной менее 32 пикселей, если вы не свернете его.
Кстати, установите
m.setCollapsible(0, False)
m.setCollapsible(1, False)
, если вы хотите, чтобы разделитель прекратил сворачивание двух его дочерних элементов.виджеты.Подробнее здесь.
Решение, которое я нашел, состоит в том, чтобы перегрузить sizeHint()
метод виджета, который вы хотите включить в разделитель, как в примере ниже (посмотрите на ButtonWrapper класса и что выводится как сейчас).
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Python 3.6.2 and PyQt5 are used in this example
from PyQt5.QtWidgets import (
QPushButton,
QSplitter,
QWidget,
QApplication,
)
import sys
class ButtonWrapper(QPushButton):
def sizeHint(self):
return self.minimumSize()
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(400, 400)
m = QSplitter(self)
m.resize(200, 100)
x = ButtonWrapper(self)
x.setGeometry(0, 0, 100, 100)
y = QPushButton(self)
y.setGeometry(0, 100, 100, 100)
m.addWidget(x)
m.addWidget(y)
m.setSizes([20, 180])
#Now it really shows "20" as expected
print(x.width())
#minimumWidth() is zero by default for empty QPushButton
print(x.minimumWidth())
#Result of our overloaded sizeHint() method
print(x.sizeHint().width())
print(x.minimumSizeHint().width())
self.setWindowTitle('Example')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Я не уверен, что это правильный способ делать вещи, но я потратил много времени, пытаясь решить моюсвоя собственная проблема, связанная с этим, и до сих пор не видела ничего удовлетворительного.Я буду очень признателен, если кто-то знает, что лучше реально работает и работает обходной путь.