Автоматическое изменение размера QStackedWidget - PullRequest
1 голос
/ 24 марта 2020

У меня есть класс StackedWidget, который наследуется от QStackedWidget. Стандартное поведение QStackedWidget заключается в том, что он принимает размер своего самого большого элемента. То, что я хочу сделать, это заставить его изменить размер до текущего элемента. Я уже попробовал пару решений, найденных здесь, и ни одно из них не работает, включая, например, установку политик размера или вызов hide() для всех виджетов, которые go скрыты из виду.

Я думаю, что проблема может заключаться в двух Возможности: 1. Что-то ужасно не так с StackedWidget. 2. Проблема изменения размера относится не только к StackedWidget, но к некоторому макету или другому виджету, в который вложен StackedWidget.

  1. Что касается первой возможности, здесь я предоставляю StackedWidget класс.

Пожалуйста, посмотрите, как выглядит мое объявление StackedWidget:

  class StackedWidget : public QStackedWidget
  {
    Q_OBJECT
    private:
      QComboBox* widgetChooser = nullptr;
    public:
      StackedWidget(QWidget* parent) : QStackedWidget(parent) {}
      void setWidgetChooser(QComboBox* widgetChooser);
      void addWidget(QWidget* widget);
    private:
      void makeConnection();
    signals:
    public slots:
      void setCurrentIndex(const int& index);
  };

Вот определение:

    void StackedWidget::setWidgetChooser(QComboBox* widgetChooser)
    {
      if (widgetChooser == nullptr) throw RuntimeError("widgetChooser is nullptr");
      this->widgetChooser = widgetChooser;
      makeConnection();
    }

    void StackedWidget::addWidget(QWidget* widget)
    {
      widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
      QStackedWidget::addWidget(widget);
    }

    void StackedWidget::makeConnection()
    {
      connect(widgetChooser, SIGNAL(currentIndexChanged(int)), this, SLOT(setCurrentIndex(int)));
    }

    void StackedWidget::setCurrentIndex(const int& index)
    {
      qDebug() << "Index changed to " << index;
      QWidget* pWidget = widget(index);
      Q_ASSERT(pWidget);
      QStackedWidget::setCurrentWidget(pWidget);
      pWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
      pWidget->adjustSize();
      adjustSize();
    }
Принимая во внимание вторую возможность, здесь рассказывается, как я использую StackedWidget.
void SchemaWidget::TempBuildAlt(const SchemaElement* son, QVBoxLayout* parentLayout)
  {
    if (auto schemaAlternative = dynamic_cast<const SchemaAlternatives*>(son))
    {
      QComboBox* widgetBox = BuildWidgetChooserBox(schemaAlternative);
      StackedWidget* stackedWidget = BuildStackedWidget(schemaAlternative);
      stackedWidget->setWidgetChooser(widgetBox);

      QHBoxLayout* boxLayout = new QHBoxLayout;
      boxLayout->addWidget(new QLabel(schemaAlternative->Name, this));
      boxLayout->addWidget(widgetBox);

      QVBoxLayout* layout = new QVBoxLayout;
      layout->addLayout(boxLayout);
      layout->addWidget(stackedWidget);

      parentLayout->addLayout(layout);
    } else throw RuntimeError("Cannot cast son to SchemaAlternatives.");
  }

  QComboBox* SchemaWidget::BuildWidgetChooserBox(const SchemaAlternatives* schema)
  {
    QComboBox* alternativesBox = new QComboBox(this);
    QStringListModel* listModel = new QStringListModel(this);
    QStringList list;
    for (int i = 1; i <= schema->Sons.High(); ++i)
    {
      if (const SchemaTree* son = dynamic_cast<const SchemaTree*>(schema->Sons(i).Get()))
      {
        list << son->Name;
      }
      else throw RuntimeError("Son cannot be cast to SchemaTree.");
    }
    listModel->setStringList(list);
    alternativesBox->setModel(listModel);
    return alternativesBox;
  }

  StackedWidget* SchemaWidget::BuildStackedWidget(const SchemaAlternatives* schema)
  {
    StackedWidget* stackedWidget = new StackedWidget(this);
    for (int i = 1; i <= schema->Sons.High(); ++i)
    {
      if (const SchemaTree* alternativeSon = dynamic_cast<const SchemaTree*>(schema->Sons(i).Get()))
      {
        QWidget* widget = new QWidget(this);
        QVBoxLayout* widgetLayout = new QVBoxLayout;
        BuildWidget(alternativeSon, widgetLayout);
        widget->setLayout(widgetLayout);
        stackedWidget->addWidget(widget);
      }
      else throw RuntimeError("Son could not be cast to SchemaTree.");
    }
    return stackedWidget;
  }

Я хочу заранее поблагодарить всех, кто захочет потратить некоторое время на мою проблему. Я ценю это. Спасибо. Ты великолепен.

...