注:我使用Python 3.6.2和PyQt5,雖然本例中的邏輯保持不變,如果你正在使用的其他版本甚至可以理解Python和PyQt。
瞭解一下什麼是說here:
如果指定一個大小爲0,則部件將是不可見的。 小部件的大小策略被保留。也就是說,小於相應小部件的最小大小提示的值將被提示的值替換。
一個爲您解決問題的選項是調用x.setMinimumWidth()
有一個很小的值,如:
x.setMinimumWidth(1)
但是,如果你自己嘗試一下,你會看到
- 它是一個骯髒的黑客,因爲它實際離開這裏小部件,只是使它很窄,
- 雖然現在你可以拖動分離器時,Wi的初始寬度dget仍然是「32」而不是「20」。
x.setMinimumWidth(0)
也不能按預期工作:它的最小寬度實際上是零默認(如該部件有沒有內容,我猜),但它並不能幫助你使分割器項目寬度小於32像素,除非您摺疊它。
順便說一句,設置
m.setCollapsible(0, False)
m.setCollapsible(1, False)
,如果你想分路器停止其坍塌兩個孩子的小部件。更多細節here.
我已經找到了解決方法是重載要包括在分線器widget的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_())
我不知道這是否是做的東西以正確的方式,但我花了很多時間試圖解決我自己的問題連接到這一點,並沒有看到滿足咫尺天涯什麼。如果有人知道更好,我將非常感激實際工作&明確解決方法。