Взаимодействие с макетом через его дочерний виджет

Допустим у меня есть следующий макет. Как я могу отключить весь ряд макета (setEnabled), где содержится определённый виджет (self.simple_textbox), и не имея к макету прямого доступа?

grid_layout = QGridLayout()
grid_layout.addWidget(QLabel("Text: "), 0, 0)
grid_layout.addWidget(self.simple_textbox, 0, 1, 1, 4)
...

Как я пытался это сделать:

    #Specify any widget in the row to be disabled
    def gridlayout_set_row_disabled(self, target_widget):
        layout = target_widget.layout()
        for i in range(layout.count()): #AttributeError: 'NoneType' object has no attribute 'count'
            item = layout.itemAt(i)
            if item.widget() == target_widget:
                row_position = layout.getItemPosition(i)[0]
                self.disable_row(layout, row_position)
                break

    def disable_row(self, layout, row):
        for column in range(layout.columnCount()):
            item = layout.itemAtPosition(row, column)
            if item is not None:
                widget = item.widget()
                if widget is not None:
                    widget.setEnabled(False)
    
    #Отключение нулевого ряда, где содержится виджет self.simple_textbox
    self.gridlayout_set_row_disabled(self.simple_textbox)

Ответы (1 шт):

Автор решения: S. Nick
  1. Пожалуйста, ВСЕГДА ПРЕДОСТАВЛЯЙТЕ МИНИМАЛЬНО-ВОСПРОИЗВОДИМЫЙ пример!!!

  2. Я не уверен, что правильно понимаю вас, но попробуйте так:


import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.simple_textbox = QTextEdit("QTextEdit")

        self.pushButton = QPushButton("Click me")
        self.pushButton.setCheckable(True)
        self.pushButton.clicked.connect(self.on_pushButton)

        grid_layout = QGridLayout(self)
        grid_layout.addWidget(QLabel("row 0 Text: "), 0, 0)
        grid_layout.addWidget(QLabel("row 1: ",
            styleSheet='background-color: #99d8c9;'), 1, 0, 1, 6)
        grid_layout.addWidget(QLabel("row 0; col 6: ",
            styleSheet='background-color: #99d8c9;'), 0, 5, 1, 1)
        grid_layout.addWidget(self.simple_textbox, 0, 1, 1, 4)
        grid_layout.addWidget(self.pushButton, 4, 0, 1, 6)

    def on_pushButton(self, state):
        if state:
            self.gridlayout_set_row_enabled(self.simple_textbox, state=False)
        else:
            self.gridlayout_set_row_enabled(self.simple_textbox, state=True)

    #Specify any widget in the row to be disabled
    def gridlayout_set_row_enabled(self, target_widget, state=True):

#       AttributeError: 'NoneType' object has no attribute 'count'
#                layout = target_widget.layout()
# -------------> vvvv <-- ^^^^^^^^^^^^^ <--------------------------------------
        layout = self.layout()

        for i in range(layout.count()): 
            item = layout.itemAt(i)
            if item.widget() == target_widget:
                
                row_position = layout.getItemPosition(i)[0]
                self.disable_row(layout, row_position, state)
                return

    def disable_row(self, layout, row, state):
        for column in range(layout.columnCount()):
            item = layout.itemAtPosition(row, column)
            if item is not None:
                widget = item.widget()
                if widget is not None:
                    if not state:
                        widget.setEnabled(False)
                    else:
                        widget.setEnabled(True)
                        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 15, QtGui.QFont.Bold))
    w = MainWindow()
    w.setWindowTitle("Example")
    w.resize(500, 300)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка