隐藏和显示所有包含的小部件的QGridLayout

时间:2019-05-04 20:24:18

标签: python pyqt5

我想显示或隐藏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>

1 个答案:

答案 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
...