QWidget :: setLayout: Попытка установить QLayout "" на ProgramWindow "", который уже имеет макет - PullRequest
0 голосов
/ 04 мая 2018
import os
import sys

from PyQt5 import QtGui
from PyQt5 import QtWidgets

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

def main():
    app = QtWidgets.QApplication(sys.argv)
    programWindow = ProgramWindow()

    programWindow.show()
    sys.exit(app.exec_())


class ProgramWindow(QtWidgets.QMainWindow):

    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)

        self.setup_main_window()
        self.set_window_layout()

    def setup_main_window(self):
        self.resize( 800, 600  )
        self.setWindowTitle( "Test" )

    def set_window_layout(self):
        self.startSimulationButton = QPushButton( 'Start Simulation' )

        horizontalLayout = QHBoxLayout()
        horizontalLayout.addWidget( self.startSimulationButton )

        horizontalGroupBox = QGroupBox( "My Group" )
        horizontalGroupBox.setLayout( horizontalLayout )

        main_vertical_layout = QVBoxLayout()
        main_vertical_layout.addWidget( horizontalGroupBox )
        self.setLayout( main_vertical_layout )


if __name__ == "__main__":
    main()

Когда я запускаю его, он показывает пустое окно и выдает эту ошибку на консоли:

QWidget::setLayout: Attempting to set QLayout "" on ProgramWindow "", which already has a layout

Я уже посмотрел на QLayout: Попытка добавить QLayout "" в QWidget "", который уже имеет макет , но я не думаю, что делаю что-либо из этого, что не так с этим кодом?

Закомментирование последней строки self.setLayout( main_vertical_layout ) исправляет это, но, конечно, ничего не показывает на экране.

Этот код должен создать QGroupBox с макетом QHBoxLayout и поместить QGroupBox внутри макета QVBoxLayout. И QVBoxLayout должно быть прикреплено к моему главному окну:

  1. QHBoxLayout
  2. QGroupBox
  3. QVBoxLayout
  4. ProgramWindow

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

С учетом сказанного @Aviad ваш код может выглядеть следующим образом:

import sys

from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QPushButton,
                             QHBoxLayout, QGroupBox, QVBoxLayout)

class ProgramWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setup_main_window()
        self.set_window_layout()

    def setup_main_window(self):
        self.centralwidget = QWidget()
        self.setCentralWidget(self.centralwidget)
        self.resize( 800, 600  )
        self.setWindowTitle( "Test" )

    def set_window_layout(self):
        self.startSimulationButton = QPushButton( 'Start Simulation' )

        self.horizontalLayout = QHBoxLayout(self.centralwidget) 
        self.horizontalLayout.addWidget( self.startSimulationButton )

        self.horizontalGroupBox = QGroupBox( "My Group" )
        self.horizontalLayout.addWidget( self.horizontalGroupBox )

        self.main_vertical_layout = QVBoxLayout()
        self.horizontalGroupBox.setLayout( self.main_vertical_layout )
        button1 = QPushButton( 'Button1' )
        button2 = QPushButton( 'Button2' )
        self.main_vertical_layout.addStretch(1)
        self.main_vertical_layout.addWidget( button1 )
        self.main_vertical_layout.addWidget( button2 )

def main():
    app = QApplication(sys.argv)
    programWindow = ProgramWindow()

    programWindow.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

enter image description here

0 голосов
/ 04 мая 2018

Правильный способ использования QMainWindow - это «центральный виджет», установите этот центральный виджет с вашим макетом, и вы его получили. См. setCentralWiget

...