Python 为什么会出现QLabel?

Python 为什么会出现QLabel?,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,当我运行下面的代码时,标签小部件(?)显示出来,即使它没有被添加到任何布局中。 我遵循的教科书也暗示我不应该看到它(直到我将它添加到布局中),但它无论如何都会出现。我原以为会看到一扇空窗户。有什么想法吗 import sys from PyQt5 import QtWidgets as qtw from PyQt5 import QtGui as qtg from PyQt5 import QtCore as qtc class MainWindow(qtw.QWidget): de

当我运行下面的代码时,
标签
小部件(?)显示出来,即使它没有被添加到任何布局中。 我遵循的教科书也暗示我不应该看到它(直到我将它添加到布局中),但它无论如何都会出现。我原以为会看到一扇空窗户。有什么想法吗

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtGui as qtg
from PyQt5 import QtCore as qtc

class MainWindow(qtw.QWidget):

    def __init__(self):
        """MainWindow constructor"""
        super().__init__(windowTitle='Hello world')

        # QWidget
        subwidget = qtw.QWidget(self, toolTip='This is my widget')
        subwidget.setToolTip('This is YOUR widget')
        print(subwidget.toolTip())

        # QLabel
        label = qtw.QLabel('<b>Hello Widgets!</b>', self, margin=10)

        self.show()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = MainWindow()
    sys.exit(app.exec())
导入系统 从PyQt5将QtWidgets作为qtw导入 从PyQt5将QtGui作为qtg导入 从PyQt5导入QtCore作为qtc 类主窗口(qtw.QWidget): 定义初始化(自): “”“主窗口构造函数”“” 超级() #QWidget subwidget=qtw.QWidget(self,toolTip='This is my widget') setToolTip('这是您的小部件') 打印(子窗口小部件.toolTip()) #QLabel label=qtw.QLabel('Hello Widgets!',self,margin=10) self.show() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=qtw.QApplication(sys.argv) mw=主窗口() sys.exit(app.exec())
你所期望的是不正确的,我不会指出这本书的任何内容,因为你没有指出这本书是什么书,也没有指出你可能误解了作者所指出的内容的引文


如果第一个小部件是第二个小部件的子部件或已经显示在小部件中的小部件的子部件,则小部件显示为另一个小部件的一部分

在您的示例中,当传递“self”时,您指出QLabel是窗口的子对象:

print(subwidget.parentWidget())
打印(label.parentWidget())
输出:

<__main__.MainWindow object at 0x7f10757a4dc0>
<__main__.MainWindow object at 0x7f10757a4dc0>
<__main__.MainWindow object at 0x7faf9ced2e50>
<__main__.MainWindow object at 0x7faf9ced2e50>
输出:

<__main__.MainWindow object at 0x7f10757a4dc0>
<__main__.MainWindow object at 0x7f10757a4dc0>
<__main__.MainWindow object at 0x7faf9ced2e50>
<__main__.MainWindow object at 0x7faf9ced2e50>


总之:


如果一个小部件是另一个小部件的子部件,则该小部件将显示为另一个小部件的一部分。有一些例外情况,例如隐藏小部件,可以确定子小部件是一个弹出窗口。

还值得一提的是,如果小部件是在
\uuuu init\uuuu
之外创建的,并且没有添加到布局中,则除非
show()
setVisible(True),否则不会显示它
被调用。@musicamante事实上这部分是正确的,如果在父窗口小部件已经可见之后添加,则子窗口小部件将不可见,如我在回答中所述: