добавить макет в другой макет из родительского окна - PullRequest
1 голос
/ 21 апреля 2020

Я новичок в этом поле, и я надеюсь, что это не кажется глупым вопросом. Я использую PyQt5 для Python 3.8 на Mac. Я хочу добавить макет (addLayout) в другой макет из родительского окна, если это возможно !

Это пример: у меня есть класс (ParentWindow), у него много виджетов и hboxlayout. (ChildWindow) - это класс, унаследованный от ParentWindow, и он также имеет виджеты и другую разметку; вопрос: можно ли добавить макет в дочернее окно? Если я использую setLayout в ChildWindow, он игнорирует его и показывает сообщение: (QWidget :: setLayout: Попытка установить QLayout "" на ChildWindow "", который уже имеет макет). Итак, могу ли я использовать addLayout для родительского макета окна? И как

# The Parent Class
from PyQt5.QtWidgets import  QWidget, QHBoxLayout,QLabel
class ParentWindow(QWidget):
    def __init__(self):
        super().__init__()
        title = "Main Window"
        self.setWindowTitle(title)
        left = 000; top = 500; width = 600; hight = 300
        self.setGeometry(left, top, width, hight)
        MainLayoutHbox = QHBoxLayout()
        header1 = QLabel("Header 1")
        header2 = QLabel("Header 2")
        header3 = QLabel("Header 3")
        MainLayoutHbox.addWidget(header1)
        MainLayoutHbox.addWidget(header2)
        MainLayoutHbox.addWidget(header3)
        self.setLayout(MainLayoutHbox)
# End of Parent Class


# The SubClass

from PyQt5.QtWidgets import QApplication,   QVBoxLayout, QHBoxLayout,  QTabWidget, QLabel
import sys

from ParentWindow import ParentWindow


class ChildWindow(ParentWindow):
    def __init__(self):
        super().__init__()
        vbox = QVBoxLayout()
        MainLabel= QLabel("My Window")

        vbox.addWidget(MainLabel)

        self.setLayout(vbox) # This show the Warning  Error

        # I assume the below code should work to extend the parent layout!! But it gives error
        # parent.MainLayoutHbox.addLayout(vbox)




if __name__ == "__main__":
    App = QApplication(sys.argv)
    MyWindow= ChildWindow()
    MyWindow.show()
    App.exec()

1 Ответ

1 голос
/ 21 апреля 2020

ChildWindow - это ParentWindow, то есть ChildWindow имеет предустановленные свойства в ParentWindow, в которые вы добавили макет, а с помощью Z-кода вы добавляете макет, но Qt сообщает вам: QWidget :: setLayout: Попытка установить QLayout "" on ChildWindow "", который уже имеет макет , который указывает, что у вас уже есть макет (макет, который вы унаследовали от родительского).

Если вы хотите добавить MainLabel к - существующий макет через другой макет, то вы должны получить доступ к унаследованному макету с помощью метода layout () и добавить его:

class ChildWindow(ParentWindow):
    def __init__(self):
        super().__init__()
        vbox = QVBoxLayout()
        MainLabel= QLabel("My Window")
        vbox.addWidget(MainLabel)
        # self.layout() is MainLayoutHbox
        self.layout().addLayout(vbox)
...