1 Вопрос: Как получить имя родительского виджета, напечатанное из класса дочернего виджета?

вопрос создан в Thu, May 2, 2019 12:00 AM

Я понимаю, что этот вопрос прост, но я все равно застрял. Есть ли способ получить имя виджета родительского макета из унаследованного класса виджетов?

У меня есть небольшой кусочек кода здесь. Поэтому в основном мне нужно напечатать self.super_main_layout в поле метки, где печатается «Нажать кнопку».

У меня есть функция def print_foo, которая должна это делать. Но я не знаю, как получить имя parent() из унаследованного класса. Мне нужно получить именно этот self.super_main_layout, напечатанный в поле метки.

Я пытался использовать метод self.parent(), но он не работает

import sys 
from PyQt5  import QtWidgets, QtCore, QtGui 
from PyQt5.QtWidgets import QApplication

class ButtonTest(QtWidgets.QWidget):
    def __init__(self):
        super(ButtonTest, self).__init__()

        self.setFixedSize(300, 100)
        self.layout = QtWidgets.QHBoxLayout()
        self.setLayout(self.layout)
        self.label = QtWidgets.QLabel("Push the Button")
        self.button = QtWidgets.QPushButton("Button")
        self.button.clicked.connect(self.print_foo)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.button)

    def print_foo(self):
        ### ???????????
        self.label.setText(str(self.parent().parent())) # ????
        print(self.parent()) # ????

class MyApp(QtWidgets.QWidget):
    def __init__(self):
        super(MyApp, self).__init__()

        self.W = ButtonTest()

        self.setFixedSize(300,300)
        self.super_main_layout = QtWidgets.QVBoxLayout()
        self.setLayout(self.super_main_layout)
        self.super_main_layout.addWidget(self.W)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyApp()
    w.show()
    sys.exit(app.exec_())

Так что теперь, когда вы нажимаете кнопку, он печатает None в поле метки. Но я хочу, чтобы виджет макета self.super_main_layout был напечатан. Есть ли способ сделать это? Я сейчас работаю над большим проектом. И я программирую только унаследованный класс с кнопкой, в которой я должен получать разные родительские имена при нажатии кнопки. Большое спасибо.

пс. Я совершенно новичок в этом сайте и вообще программирую, так что извините за любые ошибки. Заранее спасибо!

    
1
1 ответ                              1                         

Имя переменной само по себе невозможно получить, поскольку имена переменных являются относительными, например, если код был следующим:

# ...
self.setFixedSize(300,300)
self.super_main_layout = QtWidgets.QVBoxLayout()
foo_obj = self.super_main_layout
self.setLayout(foo_obj)
self.super_main_layout.addWidget(self.W)

Как называется макет: self.super_main_layout или foo_obj? Поскольку обе переменные ссылаются на один и тот же объект.

То, что вы можете получить, это сам объект с использованием родителя, а затем его макет:

def print_foo(self):
    pw = self.parentWidget()
    if pw is not None:
        print(pw.layout())
    
0
2019-05-02 15: 48: 46Z
  1. Спасибо! Теперь я поняла. Я постараюсь использовать ваш метод. Благодаря
    2019-05-02 18: 42: 34Z
источник размещен Вот