2017-02-06 2 views
1

Задача состоит в том, чтобы написать эмулятор робота. У меня есть три класса в моем коде: ControlWidget, BoardWidget и Emulator (главный виджет, который должен сочетать Control и Board в одном окне). Я собираюсь сделать несколько рисунков на BoardWidget с помощью QPainter.PyQt5: виджет не отображается после добавления в макет

class ControlWidget(QFrame): 
    def __init__(self): 
     super().__init__()   
     self._vbox_main = QVBoxLayout() 
     self.initUI()   

    def initUI(self): 
     # ... adding some buttons   
     self.setLayout(self._vbox_main) 
     self.setGeometry(50, 50, 600, 600) 
     self.setWindowTitle('Robot Controller') 

class BoardWidget(QWidget): 
    def __init__(self): 
     super().__init__()  
     self._robot_pixmap = QPixmap("robo.png")    
     self.initUI()    

    def initUI(self): 
     self.setStyleSheet("QWidget { background: #123456 }") 
     self.setFixedSize(300, 300) 
     self.setWindowTitle("Robot Emulator") 

Оба из них появляются хорошо, если показано в разных окнах:

class Emulator(QWidget): 
    def __init__(self): 
     super().__init__() 
     self._control = ControlWidget() 
     self._board = BoardWidget() 
     self._board.show() 
     self._control.show() 

That's the result...

Но магия приходит сюда. Я хочу, чтобы мой Emulator показать как доска и управления:

class Emulator(QWidget): 
    def __init__(self): 
     super().__init__() 
     self._control = ControlWidget() 
     self._board = BoardWidget()   
     self.initUI() 
     self.show() 

    def initUI(self): 
     layout = QBoxLayout(QBoxLayout.RightToLeft, self) 
     layout.addWidget(self._control) 
     layout.addStretch(1) 
     layout.addWidget(self._board) 
     self.setLayout(layout)   
     self.setWindowTitle('Robot Emulator') 
     self.setWindowIcon(QIcon("./assets/robo.png")) 
     # self._board.update() 

And the board's background disappears...

Я убил трех часов, пытаясь исправить это. Я попытался представить свою доску как QPixmap поверх QLabel внутри QBoxLayout. Я попытался заменить QBoxLayout на QHBoxLayout. Ничто не имеет никакого значения.

+0

Вы должны установить раскладку на 'BoardWidget' и добавить виджет к нему (например, «QLabel», показывающий графическую карту робота). – ekhumoro

ответ

1

Как @ekhumoro говорится в комментарии, необходимо добавить QPixmap к QLabel, а затем установить его на менеджера BoardWidget макета с setLayout() функции.

Одним из решений может быть следующим перевыполнение BoardWidget класса:

class BoardWidget(QWidget): 
    def __init__(self): 
     super().__init__() 
     self._robot_pixmap = QPixmap("robo.png") 
     self.label = QLabel() 
     self.label.setPixmap(self._robot_pixmap) 
     self._vbox_board = QVBoxLayout() 
     self.initUI() 

    def initUI(self): 
     self._vbox_board.addWidget(self.label) 
     self.setLayout(self._vbox_board) 
     self.setStyleSheet("QWidget { background: #123456 }") 
     self.setFixedSize(300, 300) 
     self.setWindowTitle("Robot Emulator") 

Результат показан здесь:

+0

Спасибо! Это работает. –

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