【发布时间】:2018-12-02 23:42:00
【问题描述】:
我尝试在两个小部件之间切换拆分器容器,以保持拆分器的实际大小。 为此,我在切换小部件后使用 QSplitter.sizes() 读取实际大小和 QSplitter.setSizes()。
问题是我有一个 QToolButton,我在 resizeEvent() 中使用 setFixedSize() 调整它的大小,因此当我设置新大小时,它通常不起作用。
我写了一个小脚本来重现这个: 在拆分器的左侧,我有一个按钮可以在两个类(它们是 QWidgets)之间切换拆分器的右侧部分。
有点精确:我想让我的 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_()
谢谢
【问题讨论】:
-
这实际上是我的第一段:我想在两个小部件之间切换拆分器容器,同时保持拆分器的实际大小。这些小部件是带有 resizeEvent 的 QToolbuttons。
-
我想保持正方形的纵横比,但是你写的是因为我刚刚发现我可以只取小部件的宽度然后用它设置高度!谢谢。
-
在评论中写代码很困难,所以这里有一个修改链接:pastebin.com/FNxNqpf7。我希望它会更容易理解我。我仍然对这种方法有一个问题(我以前已经遇到过)。当我调整拆分器的大小时,如果我的窗口很小,它会根据 QToolButton 调整窗口的大小,我无法减小窗口的大小。当我减小窗口大小高度时,我希望能够调整 QToolButton 的大小。
-
对不起,我真的不知道如何更好地解释自己。我想保持我的 QToolButton 的纵横比。通过将高度限制为宽度,我可以保留它,但我无法正确调整窗口的大小。我做了一个小演示:webmshare.com/play/KA6BV
-
如果您不知道如何创建minimal reproducible example,请不要过于简化您的问题,如果您每次都修改它导致我们厌倦了帮助您,请记住我们的工作是自愿的,因此您必须努力并花时间提供minimal reproducible example。所以当你这样做时,你让我知道。
标签: python pyqt pyqt4 qsplitter