PYQT5 QMainWindow setCentralWidget, состоящий из нескольких макетов блоков

#python #pyqt5 #qmainwindow

#python #pyqt5 #qmainwindow

Вопрос:

Для проекта в классе программирования нам нужно разработать приложение и использовать PYQT5 для графического интерфейса.

У меня есть класс, основанный на QMainWindow. Есть несколько строк кода, которые я не совсем понимаю. Ниже приведена инициализация:

 # Snippet 1
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
    QtWidgets.QMainWindow.__init__(self)
    # self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    self.setWindowTitle("Main Window")
  

Затем определяются следующие переменные / элементы графического интерфейса:

     # Snippet 2
    self.main_widget = QtWidgets.QWidget(self)

    l = QtWidgets.QVBoxLayout(self.main_widget)
    sc = MyStaticMplCanvas(width=5, height=4, dpi=100) # just some graph
    dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
    l.addWidget(sc)
    l.addWidget(dc)
  

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

    # Snippet 3
    x = QtWidgets.QHBoxLayout(self.main_widget) # new
    b1 = QtWidgets.QPushButton("Test1") # new
    b2 = QtWidgets.QPushButton("Test2") # new
    x.addWidget(p1) # new
    x.addWidget(p2) # new
  

Наконец, создается центральный виджет:

     # Snippet 4
    self.main_widget.setFocus()
    self.setCentralWidget(self.main_widget)
  

Сама программа не выдает ошибок и работает правильно. Но в окне отображаются только два графика из фрагмента 2. Если вы удалите

 self.main_widget 
  

От

 l = QtWidgets.QVBoxLayout(self.main_widget) 
  

и оставьте скобки пустыми, отображаются только кнопки в фрагменте 3.

В чем смысл следующего назначения?

 self.main_widget = QtWidgets.QWidget(self)
  

Можете ли вы объединить вертикальный и горизонтальный макет блока в один и, следовательно, отобразить две кнопки, а также два графика в качестве центрального виджета?
Это был мой первоначальный план, и я попробовал некоторые вещи с помощью опций addLayout() и setLayout() и хотел добавить эти макеты в setCentralWidget(), но безуспешно.

У вас есть идея о том, как отобразить комбинацию макетов блоков multliple в качестве центрального виджета в классе, основанном на QMainWindow?

Большое вам спасибо. 🙂

Ответ №1:

Вы можете использовать вложенные макеты addLayout() в макет; затем внутренний макет становится дочерним по отношению к макету, в который он вставлен.

 class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        # self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("Main Window")

        self.main_widget = QtWidgets.QWidget(self)
        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

        l = QtWidgets.QVBoxLayout(self.main_widget)
        sc = MyStaticMplCanvas(width=5, height=4, dpi=100)  # just some graph
        dc = MyDynamicMplCanvas(width=5, height=4, dpi=100) # another graph
        l.addWidget(sc)
        l.addWidget(dc)        

       # Snippet 3
        x = QtWidgets.QHBoxLayout()         # self.main_widget) # new
        b1 = QtWidgets.QPushButton("Test1") # new
        b2 = QtWidgets.QPushButton("Test2") # new
        x.addWidget(b1)                     # new     b1
        x.addWidget(b2)                     # new     b2

        l.addLayout(x)                                                  # <----

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = ApplicationWindow() 
    MainWindow.show() 
    sys.exit(app.exec_())        
  

Комментарии:

1. Удивительно! Это именно то, что я искал. Большое вам спасибо!