2016-03-21 3 views
1

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

ответ

1

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

layout = QVBoxLayout() 

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

Смежные вопросы