网格布局:列宽以适应禁用的小部件
Grid layout: Column width to fit also disabled widgets
我在 Qt Creator 中为小部件添加了网格布局。层次结构是:
- QScrollArea
- 带有网格布局的 ScrollAreaContents
- 三列多行的几个小部件
只要启用布局中的小部件,列的宽度就由小部件确定。但是,我在启动时禁用了所有小部件。然后,列缩小并裁剪小部件。我怎样才能强制布局尊重禁用的小部件? (或者有没有办法在不禁用小部件的情况下阻止使用它们?)
问题显然是由禁用小部件引起的。关键的几行很简单:
for widget in self.tabScrollAreaContents.children():
widget.setEnabled(False)
此处没有更多代码,只有两张图片:
使用启用的小部件正确布局:
使用禁用的小部件缩小的列:
补充:
要下载的最少代码:https://www.dropbox.com/sh/i19geisqw6nxuky/AADIPHL1xVKzLCJdoLEsTFDna?dl=0
看起来像这样(左边错了,右边没问题):
左右之间的唯一区别是这些行:
for widget in self.TabScrollAreaContentsA.children():
widget.setEnabled(False)
如果您使用以下代码检查 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)
Enables this layout if enable is true, otherwise disables it.
An enabled layout adjusts dynamically to changes; a disabled layout
acts as if it did not exist.
By default all layouts are enabled.
See also isEnabled().
也就是说,如果禁用某些布局,将与不存在一样。
造成这种行为的原因,正确的做法是禁用小部件,因为它使用了以下代码:
for obj in self.TabScrollAreaContentsA.children():
if isinstance(obj, QtGui.QWidget):
obj.setEnabled(False)
我在 Qt Creator 中为小部件添加了网格布局。层次结构是:
- QScrollArea
- 带有网格布局的 ScrollAreaContents
- 三列多行的几个小部件
只要启用布局中的小部件,列的宽度就由小部件确定。但是,我在启动时禁用了所有小部件。然后,列缩小并裁剪小部件。我怎样才能强制布局尊重禁用的小部件? (或者有没有办法在不禁用小部件的情况下阻止使用它们?)
问题显然是由禁用小部件引起的。关键的几行很简单:
for widget in self.tabScrollAreaContents.children():
widget.setEnabled(False)
此处没有更多代码,只有两张图片:
使用启用的小部件正确布局:
使用禁用的小部件缩小的列:
补充:
要下载的最少代码:https://www.dropbox.com/sh/i19geisqw6nxuky/AADIPHL1xVKzLCJdoLEsTFDna?dl=0
看起来像这样(左边错了,右边没问题):
左右之间的唯一区别是这些行:
for widget in self.TabScrollAreaContentsA.children():
widget.setEnabled(False)
如果您使用以下代码检查 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)
Enables this layout if enable is true, otherwise disables it.
An enabled layout adjusts dynamically to changes; a disabled layout acts as if it did not exist.
By default all layouts are enabled.
See also isEnabled().
也就是说,如果禁用某些布局,将与不存在一样。
造成这种行为的原因,正确的做法是禁用小部件,因为它使用了以下代码:
for obj in self.TabScrollAreaContentsA.children():
if isinstance(obj, QtGui.QWidget):
obj.setEnabled(False)