PyQt通过调整qspli的大小在两个小部件之间切换

2024-09-29 02:26:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在两个小部件之间切换拆分器容器,保持拆分器的实际大小。 为此,我使用QSplitter.尺寸()读取实际大小和QSplitter.setSizes文件()在切换小部件之后。你知道吗

问题是我有一个QToolButton,我在resizeEvent()中使用setFixedSize()调整它的大小,因此当我设置新的大小时,它通常不起作用。你知道吗

我写了一个小脚本来重现这一点: 在splitter的左边,我有一个按钮在两个类(QWidgets)之间切换splitter的右边。你知道吗

稍微精确一点:我想保持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_()

谢谢


Tags: selfsizeleftfirsticonpanelsplitterqtgui
1条回答
网友
1楼 · 发布于 2024-09-29 02:26:49

你在找^{}。在拆分器的右侧将小部件添加到此中,会将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)

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

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

查看heightForWidthlyt_left布局设置。这将帮助您保持QToolButton的1:1比率。您当前有一个首选/扩展的大小策略,如果您需要1:1的纵横比,这是没有意义的。我强烈建议在处理事件时手动调整工具按钮的大小。一般来说,在小部件上多次调用setFixedSize应该被视为最后的手段。让布局来完成工作。你知道吗

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

相关问题 更多 >