Почему этот QLabel показывает? - PullRequest
1 голос
/ 03 февраля 2020

Когда я запускаю следующий код, виджет 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())

1 Ответ

1 голос
/ 03 февраля 2020

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


Виджет отображается как часть другого виджета, если первый является дочерним элементом второго или дочерним элементом виджета, который уже отображается в виджете.

В вашем примере при передаче "self" Вы указываете, что 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>

В заключение:

Виджет будет отображаться как часть другого виджета, если для Мер - дитя последнего. Есть исключительные случаи, такие как скрытие виджета, установлено, что дочерний виджет является всплывающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...