Взаимодействие с макетом через его дочерний виджет
Допустим у меня есть следующий макет. Как я могу отключить весь ряд макета (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
→ Ссылка
Пожалуйста, ВСЕГДА ПРЕДОСТАВЛЯЙТЕ МИНИМАЛЬНО-ВОСПРОИЗВОДИМЫЙ пример!!!
Я не уверен, что правильно понимаю вас, но попробуйте так:
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_())

