3

我使用 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()
4

1 回答 1

0

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

看看这里是怎么说的:

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

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

x.setMinimumWidth(1)

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

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

x.setMinimumWidth(0)

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

顺便说一下,设置

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

如果您希望拆分器停止折叠其两个子小部件。更多细节在这里。

我找到的解决方案是重载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_())

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

于 2017-10-18T11:46:29.900 回答