如何从子窗口小部件类中打印出父窗口小部件的名称?

时间:2019-05-02 14:55:37

标签: python pyqt pyqt5

我知道这个问题很简单,但是无论如何我还是被卡住了。 有什么方法可以从继承的窗口小部件类中获取父布局窗口小部件名称?

我这里有一小段代码。因此,基本上我需要在现在打印“按一下按钮”的标签字段中打印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_())

因此,当您按下Button时,它现在在标签字段中不打印任何内容。 但是我希望打印布局小部件self.super_main_layout。 有什么办法吗?我现在正在做一个更大的项目。而且我只用按钮来编程继承的类,当按下按钮时,我必须获得不同的父名称。 非常感谢你。

ps。我对这个站点和编程都还很陌生,因此对任何错误深表歉意。预先感谢!

1 个答案:

答案 0 :(得分:0)

由于变量的名称是相对的,例如,如果代码如下,就无法获得变量本身的名称:

# ...
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_layoutfoo_obj?由于两个变量都指向同一个对象。

您可以得到的是使用父对象的对象本身,然后是其布局:

def print_foo(self):
    pw = self.parentWidget()
    if pw is not None:
        print(pw.layout())