【问题标题】:PYQT QSplitter issuePYQT QSplitter 问题
【发布时间】:2011-08-23 21:41:07
【问题描述】:

我使用 QSplitter,我发现一个小部件的最小宽度在 拆分器为 32 像素(高度为 23 像素)。有没有人知道如何 更改此默认值。换句话说,您不能拖动拆分器,以便其中一个 拆分器中的小部件(假设拆分器中有 2 个小部件)会更少 宽度超过 32 像素。

代码:

class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):

        self.resize(400,400)

        m = QtGui.QSplitter(self)
        m.resize(200, 100)

        x = QtGui.QPushButton(m)
        x.setGeometry(0, 0, 100, 100)

        y = QtGui.QPushButton(m)
        y.setGeometry(0, 100, 100, 100)


        m.setSizes([20, 180])
        # this will show you that the width of x is 32 (it should be 20!)
        print x.width()

【问题讨论】:

    标签: pyqt qsplitter


    【解决方案1】:

    注意:我使用的是 Python 3.6.2 和 PyQt5,尽管示例中的逻辑保持不变,即使您使用其他版本的 Python 和 PyQt 也可以理解。

    看看here:是怎么说的

    如果您指定大小为 0,小部件将不可见。 保留小部件的大小策略。也就是说,小于相应小部件的最小尺寸提示的值将被提示的值替换。

    解决您的问题的选项之一是调用 x.setMinimumWidth() 并使用较小的值,例如:

    x.setMinimumWidth(1)
    

    但是,如果你自己尝试一下,你会发现

    1. 这是一个肮脏的 hack,因为它实际上将小部件留在了此处,只是使它变得非常狭窄并且
    2. 虽然现在您可以拖动拆分器,但小部件的初始宽度仍然是“32”而不是“20”。

    x.setMinimumWidth(0)

    也没有按预期工作:它的最小宽度默认情况下实际上为零(因为这个小部件没有内容,我猜),但它没有除非您折叠它,否则可以帮助您使拆分器项目的宽度小于 32 像素。

    顺便说一下,设置

    m.setCollapsible(0, False)
    m.setCollapsible(1, False)
    

    如果您希望拆分器停止折叠其两个子小部件。更多详情here.

    我找到的解决方案是重载要包含在拆分器中的小部件的 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_())
    

    我不确定这是否是正确的做事方式,但我花了很多时间尝试解决与此相关的我自己的问题,但到目前为止还没有看到任何令人满意的东西。如果有人知道更好的实际可行且明确解决方法,我将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2021-01-12
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多