网格布局:列宽也适合禁用的小部件

问题描述 投票:1回答:1

我在Qt Creator中为小部件添加了网格布局。层次结构是:

  • QScrollArea
  • ScrollAreaContents具有网格布局
  • 三列和几行中的几个小部件

只要布局中的窗口小部件启用,列就会与窗口小部件确定的一样宽。但是,我在启动时禁用所有小部件。然后,列缩小并裁剪小部件。如何强制布局以尊重禁用的小部件? (或者有没有办法阻止使用小部件而不禁用它们?)

问题显然是由禁用小部件引起的。关键的线条很简单:

for widget in self.tabScrollAreaContents.children():
    widget.setEnabled(False)

这里没有其他代码,但有两张图片:

使用启用的小部件正确布局:

correct layout with enabled widgets

带有禁用小部件的收缩列:

shrinked columns with disabled widgets

补充:

最小的代码下载:https://www.dropbox.com/sh/i19geisqw6nxuky/AADIPHL1xVKzLCJdoLEsTFDna?dl=0

看起来像这样(左边错,右边很好):

screenshot

左右之间的唯一区别是这些线:

for widget in self.TabScrollAreaContentsA.children():
    widget.setEnabled(False)
python pyqt pyqt4 qscrollarea
1个回答
1
投票

如果使用以下代码检查TabScrollAreaContentsA的子项,您将获得以下内容:

for widget in self.TabScrollAreaContentsA.children():
    print(widget)

输出:

<PyQt4.QtGui.QGridLayout object at 0x7f9a19fc3f78>
<PyQt4.QtGui.QPushButton object at 0x7f9a1a0c7048>
<PyQt4.QtGui.QLineEdit object at 0x7f9a1a0c70d8>
<PyQt4.QtGui.QLabel object at 0x7f9a1a0c71f8>
<PyQt4.QtGui.QLineEdit object at 0x7f9a1a0c73a8>
<PyQt4.QtGui.QLabel object at 0x7f9a1a0c7438>
<PyQt4.QtGui.QLineEdit object at 0x7f9a1a0c74c8>
<PyQt4.QtGui.QLabel object at 0x7f9a1a0c7558>
<PyQt4.QtGui.QPushButton object at 0x7f9a1a0c75e8>
<PyQt4.QtGui.QLineEdit object at 0x7f9a1a0c7678>

据观察,它看起来像一个孩子的布局,并根据docs

QLayout.setEnabled(self,bool)

如果enable为true,则启用此布局,否则禁用它。

启用的布局会动态调整以适应更改;禁用的布局就好像它不存在一样。

默认情况下,启用所有布局。

另请参见isEnabled()。

也就是说,如果你禁用某些布局将会不相同,如果它不存在。

而这种行为的原因,正确的事情只是禁用小部件,因为它使用了以下代码:

for obj in self.TabScrollAreaContentsA.children():
    if isinstance(obj, QtGui.QWidget):
        obj.setEnabled(False)
© www.soinside.com 2019 - 2024. All rights reserved.