我尝试在两个小部件之间切换拆分器容器,以保持拆分器的实际大小。 为此,我在切换小部件后使用QSplitter.sizes()读取实际大小,并使用QSplitter.setSizes()。
问题是我有一个QToolButton,它在resizeEvent()中用setFixedSize()调整了大小,因此,当我设置新的大小时,它通常不起作用。
我写了一个小脚本来重现此内容: 在拆分器的左侧,我有一个按钮可在两个类(即QWidget)之间切换拆分器的右侧。
有点精度:我想将QToolbutton的纵横比保持在1:1。
这里是一个演示: https://webmshare.com/play/5Bmvn
所以这里是脚本:
from PyQt4 import QtGui, QtCore
minSize = 50
maxSize = 350
class mainWindow(QtGui.QWidget):
def __init__(self):
super(mainWindow, self).__init__()
self.layout = QtGui.QVBoxLayout(self)
self.splitter = QtGui.QSplitter(QtCore.Qt.Horizontal, self)
self.splitter.setHandleWidth(20)
self.layout.addWidget(self.splitter)
wgt_left = QtGui.QWidget()
lyt_left = QtGui.QVBoxLayout(wgt_left)
self.btn_toggleSplitter = QtGui.QPushButton('Toggle Button')
self.btn_toggleSplitter.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
self.btn_toggleSplitter.setCheckable(True)
lyt_left.addWidget(self.btn_toggleSplitter)
self.splitter.addWidget(wgt_left)
self.first = panel('1')
self.second = panel('2')
self.splitter.addWidget(self.first)
self.width = self.first.size()
self.btn_toggleSplitter.clicked.connect(self.ToggleParent)
def ToggleParent(self):
self.sizes = self.splitter.sizes()
if self.btn_toggleSplitter.isChecked() == True:
self.first.setParent(None)
self.splitter.addWidget(self.second)
else :
self.second.setParent(None)
self.splitter.addWidget(self.first)
self.splitter.setSizes(self.sizes)
class panel(QtGui.QWidget):
def __init__(self, text):
super(panel, self).__init__()
lyt_main = QtGui.QVBoxLayout(self)
lyt_icon = QtGui.QHBoxLayout()
self.tbtn_icon = QtGui.QToolButton()
self.tbtn_icon.setText(text)
self.tbtn_icon.setMinimumSize(QtCore.QSize(minSize,minSize))
self.tbtn_icon.setMaximumSize(QtCore.QSize(maxSize,maxSize))
lyt_icon.addWidget(self.tbtn_icon)
lyt_horizontal = QtGui.QHBoxLayout()
lyt_horizontal.addWidget(QtGui.QPushButton('3'))
lyt_horizontal.addWidget(QtGui.QPushButton('4'))
lyt_main.addWidget(QtGui.QLabel('Below me is the QToolButton'))
lyt_main.addLayout(lyt_icon)
lyt_main.addLayout(lyt_horizontal)
lyt_main.addWidget(QtGui.QPlainTextEdit())
def resizeEvent(self, event):
w = panel.size(self).width()
h = panel.size(self).height()
size = min(h, w)-22
if size >= maxSize:
size = maxSize
elif size <= minSize:
size = minSize
self.tbtn_icon.setFixedSize(size, size)
app = QtGui.QApplication([])
window = mainWindow()
window.resize(600,300)
window.show()
app.exec_()
谢谢
答案 0 :(得分:1)
您正在寻找QtGui.QStackedWidget
。将小部件添加到拆分器的右侧,会将self.first
和self.second
的构造代码更改为:
self.stack_right = QtGui.QStackedWidget()
self.splitter.addWidget(self.stack_right)
self.first = panel('1')
self.second = panel('2')
self.stack_right.addWidet(self.first)
self.stack_right.addWidget(self.second)
然后使用您的ToggleParent
方法:
def ToggleParent(self):
if self.btn_toggleSplitter.isChecked() == True:
self.stack_right.setCurrentWidget(self.second)
else:
self.stack_right.setCurrentWidget(self.first)
这将避免缓存和手动调整窗口小部件大小的麻烦。
附录: 工具按钮缩放实际上是一个单独的问题,但这是一个提示:
看看heightForWidth
的{{1}}布局设置。这将帮助您将lyt_left
保持1:1的比例。您目前有“首选/扩展”的尺寸政策,如果您需要1:1的宽高比,则没有任何意义。 与在处理事件时手动调整工具按钮的大小相比,我强烈建议这样做。通常,在小部件上多次调用QToolButton
应该被认为是最后的选择。让布局完成工作。
附录的附录:戳一戳(已经有一段时间了),您可能需要从setFixedSize
继承并重新实现QToolButton
和hasHeightForWidth()
方法。这里有很多问题要解决。只需搜索 heightForWidth 。