Замените макет QScrollArea новым.

Я написал программу, которая создает графический интерфейс с использованием PyQt. Из Qt Designer у меня есть MainWindow, QTabWidget внутри него и QScrollArea внутри QTabWidget. Я пытаюсь динамически создать список совпадений с данными совпадений, добавить каждое совпадение в макет виджета и поместить этот макет в QScrollArea. В настоящее время мой код делает это отлично, за исключением того, что он вызывает следующую ошибку:

QLayout: Attempting to add QLayout "" to MainWindow "MainWindow", which already has a layout

Это имеет смысл для меня, но я не понимаю, как это исправить. Я даже не совсем уверен, как то, что у меня есть, делает то, что делает, что затрудняет его исправление.

Внутри моего метода MainWindow __init__() я создаю экземпляр класса MatchHistoryBuilder (который строит каждое совпадение), вызываю метод buildMatchHistory() (который находится в классе MainWindow) и передаю ему этот экземпляр MatchHistoryBuilder, например:

matchHistoryBuilder = MatchHistoryBuilder(self)
self.buildMatchHistory(matchHistoryBuilder)

Вот мой метод buildMatchHistory:

def buildMatchHistory(self, matchHistoryBuilder):
        # This method takes whatever matches are in match_history.txt, calls MatchHistoryBuilder.buildMatch() on each, 
        # and builds the GUI objects for the match history into the matchHistoryScrollArea.
        # Globals: self.mainWindow

        # Open match_history.txt and read json data into matchHistoryData
        fileLocation = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
        fileLocation = fileLocation + '\match_history.txt'
        with open(fileLocation,  'r') as f:
            matchHistoryData = json.load(f)
        matchHistoryData = matchHistoryData["matches"]

        # Scroll Area Properties
        matchHistory = self.ui.matchHistoryScrollArea
        matchHistory.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        matchHistory.setWidgetResizable(True)

        # Container Widget       
        widget = QWidget()
        # Layout of Container Widget
        layout = QVBoxLayout(self)
        for matchIndex, matchInstance in enumerate(matchHistoryData):
            matchId = matchInstance["matchId"]
            match = matchHistoryBuilder.buildMatch(summonerId, matchIndex, matchId)
            layout.addWidget(match)
        widget.setLayout(layout)

        matchHistory.setWidget(widget)

MatchHistoryBuilder.buildMatch() правильно возвращает QGroupBox.

Как я могу заставить этот метод правильно построить каждый объект соответствия, добавить их в QVBoxLayout и добавить этот QVBoxLayout в мой QScrollArea?


person Tyler Cheek    schedule 21.03.2016    source источник


Ответы (1)


При создании QVBoxLayout не указывайте ему self (MainWindow) в качестве родителя

layout = QVBoxLayout()

Передача родителя в QLayout автоматически сделает его макетом верхнего уровня для этого виджета.

person Brendan Abel    schedule 21.03.2016