Как получить имя родительского виджета, напечатанное из класса дочернего виджета? - PullRequest
1 голос
/ 02 мая 2019

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

У меня есть небольшой кусочек кода здесь.Поэтому в основном мне нужно напечатать 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 Ответ

0 голосов
/ 02 мая 2019

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

# ...
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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...