[当我运行以下代码时,即使未将label
小部件(?)添加到任何布局中,也会显示。我遵循的教科书还暗示我不应该看到它(直到我将其添加到布局中),但无论如何它还是会出现。我期待看到一个空的窗口。有什么想法吗?
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())
您所期望的是不正确的,因为您没有指出这本书是什么,或者在引文中表明您可能误解了作者指出的内容,所以我不会指出这本书的任何内容。
如果第一个是第二个的子项或已经在该窗口小部件中显示的一个子项的子项,则将一个子项显示为另一个子项的一部分。
在您传递“自我”的示例中,您指出QLabel是窗口的子级:
print(subwidget.parentWidget())
print(label.parentWidget())
输出:
<__main__.MainWindow object at 0x7f10757a4dc0>
<__main__.MainWindow object at 0x7f10757a4dc0>
因此,如果有效,将显示它们。
因此,如果未将其设置为父项,为什么会显示在布局中设置的窗口小部件?好,当在内部建立布局时,它会确定窗口小部件的父级是在其中创建布局的窗口小部件
class MainWindow(qtw.QWidget):
def __init__(self):
super().__init__(windowTitle="Hello world")
btn1 = qtw.QPushButton("btn1")
btn2 = qtw.QPushButton("btn2")
lay = qtw.QVBoxLayout(self)
lay.addWidget(btn1)
lay.addWidget(btn2)
print(btn1.parentWidget())
print(btn2.parentWidget())
输出:
<__main__.MainWindow object at 0x7faf9ced2e50>
<__main__.MainWindow object at 0x7faf9ced2e50>
结论:
如果一个小部件是另一个小部件的儿子,则该小部件将作为另一个小部件的一部分显示。在某些特殊情况下,例如隐藏窗口小部件,可以确定子窗口小部件是弹出窗口。