注意:我使用的是Python 3.6.2和PyQt5,但示例中的逻辑保持不变,即使您使用其他版本的Python和PyQt也可以理解。
看看这里here:
如果指定大小为0,则小部件将不可见。 小部件的大小策略将被保留。也就是说,小于相应小部件的最小大小提示的值将被替换为提示的值。
解决问题的选项之一是调用x.setMinimumWidth()
并设置一个小值,例如:
x.setMinimumWidth(1)
然而,如果你自己尝试一下,你会发现:
- 这是一个肮脏的黑客技巧,因为它实际上只是让小部件变得非常狭窄,但仍然留在原地。
- 虽然现在你可以拖动分隔条,但小部件的初始宽度仍然是“32”,而不是“20”。
x.setMinimumWidth(0)
同样不符合预期:它的最小宽度默认实际上为零(我猜是因为这个小部件没有内容),但是除非你折叠它,否则它不能帮助你使分隔条项小于32像素宽。
顺便说一下,设置
m.setCollapsible(0, False)
m.setCollapsible(1, False)
如果你想让分割器停止折叠其两个子部件。更多细节
在这里。
我发现的解决方案是重载你想要包含到分割器中的小部件的
sizeHint()
方法,就像下面的例子一样(看看
ButtonWrapper类和现在的输出)。
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])
print(x.width())
print(x.minimumWidth())
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_())
我不确定这是否是正确的做法,但我已经花了很多时间尝试解决自己与此相关的问题,但迄今为止还没有看到令人满意的东西。如果有人知道更好的实际可行且清晰明了的解决方法,我将非常感激。