我想显示或隐藏QGridLayout
中的所有小部件。
在下面的Python 3代码中,触发切换时没有错误消息,但不幸的是,GUI并未更改。
代码有什么问题?
main.py
#!/usr/bin/python3
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self._show_option_1 = True
self._show_option_2 = True
loadUi("mainwindow.ui", self)
self.show()
def toggle_option_1(self):
self._show_option_1 ^= True
if self._show_option_1:
self.gridLayout_left.setEnabled(True)
print("Show left layout")
else:
self.gridLayout_left.setEnabled(False)
print("Hide left layout")
def toggle_option_2(self):
self._show_option_2 ^= True
if self._show_option_2:
self.gridLayout_right.setEnabled(True)
print("Show right layout")
else:
self.gridLayout_right.setEnabled(False)
print("Hide right layout")
def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.pushButton_left.clicked.connect(main_window.toggle_option_1)
main_window.pushButton_right.clicked.connect(main_window.toggle_option_2)
sys.exit(app.exec_())
if __name__ == "__main__":
main()
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="locale">
<locale language="English" country="UnitedKingdom"/>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_left">
<item row="0" column="0">
<widget class="QLabel" name="label_left">
<property name="text">
<string>Option 1:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_left"/>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_right">
<item row="0" column="0">
<widget class="QLabel" name="label_right">
<property name="text">
<string>Option 2:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_right"/>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pushButton_left">
<property name="text">
<string>Toggle Option 1</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButton_right">
<property name="text">
<string>Toggle Option 2</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>555</width>
<height>28</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
答案 0 :(得分:1)
QLayout.setEnabled()
更改布局状态(将其“存在/不存在”设置为比实际启用/禁用更多),但未触及基础子控件。
要禁用控件,您要么必须在它们上循环,要么使用QWidget
并将其布局放置在其中。
如果您必须使用布局并想要控制基础子级,则可以执行以下操作:
for child in self.gridLayout_left.findChildren(QWidget):
child.setEnabled(state)
使用QWidget
代替QGridLayout
,您的代码会变得更加简洁,因为禁用/隐藏小部件,还会禁用/隐藏所有基础子元素,因此您的代码变得更加简单。示例:
...
self.wgtContainer_left.setVisible(True) # To hide/show
self.wgtContainer_left.setEnabled(False) # To disable/enable
...