gpt4 book ai didi

python - PyQt - 在两个小部件之间切换而不调整 qsplitter 大小

转载 作者:行者123 更新时间:2023-12-01 08:38:42 27 4
gpt4 key购买 nike

我尝试在两个小部件之间切换拆分器容器,保持拆分器的实际大小。为此,我使用 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_()

谢谢

最佳答案

您正在寻找QtGui.QStackedWidget 。将小部件添加到拆分器右侧,会将 self.firstself.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)

这将避免缓存和手动调整小部件大小的尴尬。

附录:工具按钮缩放实际上是一个单独的问题,但这里有一个提示:

查看 lyt_leftheightForWidth 布局设置。这将帮助您保持 QToolButton 的比例为 1:1。您当前的尺寸策略为“首选/扩展”,如果您需要 1:1 的宽高比,则该策略没有意义。 我强烈建议在处理事件时手动调整工具按钮的大小。通常,在小部件上多次调用 setFixedSize 应被视为最后的手段。让布局来完成工作。

附录:做一点小小的探索(已经有一段时间了),您可能需要继承QToolButton并重新实现hasHeightForWidth()heightForWidth( ) 方法。这里有很多关于这个主题的问题。只需搜索heightForWidth

关于python - PyQt - 在两个小部件之间切换而不调整 qsplitter 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53585721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com