Автоматическая настройка высоты страницы `stackedWidget` на высоту размещенных на ней виджетов - PullRequest
1 голос
/ 26 января 2020

Я бы хотел отрегулировать высоту stackedWidget так, чтобы высота виджета QTextEdit под ним соответствовала высоте кнопок на активной странице stackedWidget. В то время как 4 QPushButton на странице extended занимают все пространство stackedWidget, 2 QPushButton на странице normal располагаются вертикально посередине и все еще имеют свободное пространство выше и ниже.

Но 2 QPushButton на странице normal должно быть вверху, а виджет QTextEdit должен быть увеличен вверх. Как это можно сделать?


main.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        loadUi("mainwindow.ui", self)


def main():
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>601</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="locale">
   <locale language="English" country="UnitedKingdom"/>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <property name="currentIndex">
       <number>0</number>
      </property>
      <widget class="QWidget" name="normal" native="true">
       <layout class="QGridLayout" name="gridLayout">
        <item row="0" column="0">
         <widget class="QPushButton" name="normal_start_button">
          <property name="text">
           <string>Start</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QPushButton" name="normal_stop_button">
          <property name="text">
           <string>Stop</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
      <widget class="QWidget" name="extended">
       <layout class="QGridLayout" name="gridLayout_3">
        <item row="0" column="0">
         <widget class="QPushButton" name="extended_quick_start_button">
          <property name="text">
           <string>Quick Start</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QPushButton" name="extended_stop_button">
          <property name="text">
           <string>Stop</string>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QPushButton" name="extended_slow_start_button">
          <property name="text">
           <string>Slow Start</string>
          </property>
         </widget>
        </item>
        <item row="1" column="1">
         <widget class="QPushButton" name="extended_pause_button">
          <property name="text">
           <string>Pause</string>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QTextEdit" name="output"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>24</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Снимок экрана страницы normal только 2 QPushButton и неиспользуемое пространство сверху и снизу:

imagenormal">


Снимок экрана страницы extended с 4 QPushButton и оптимальное использование доступного пространства:

imageextended">

1 Ответ

2 голосов
/ 26 января 2020

QStackedWidget принимает в качестве высоты по умолчанию максимальную высоту по умолчанию для содержащегося в нем виджета, поэтому в этом случае возможное решение состоит в том, чтобы установить высоту, принимая за высоту по умолчанию для текущих виджетов.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        loadUi("mainwindow.ui", self)
        self.stackedWidget.currentChanged.connect(self.adjustHeight)
        self.adjustHeight()

    def adjustHeight(self):
        h = self.stackedWidget.currentWidget().sizeHint().height()
        self.stackedWidget.setFixedHeight(h)


def main():
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()

    def onTimeout():
        sw = main_window.stackedWidget
        sw.setCurrentIndex((sw.currentIndex() + 1) % sw.count())

    # test
    from PyQt5.QtCore import QTimer

    timer = QTimer(timeout=onTimeout)
    timer.start(1000)

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
...