Изменение размера виджетов qt, когда их дети скрыты - PullRequest
14 голосов
/ 18 марта 2010

Как мне изменить размер виджета, когда повторяющийся дочерний элемент скрыт, чтобы он выглядел как на первом изображении?Основной макет - это QVBoxLayout, дочерний элемент для повтора также является виджетом с QVBoxLayout.

Я пробовал следующее:

  • update ()
  • updateGeometry ()
  • setGeometry (childrenRect ())
  • layout () -> activ ()

на главном виджете, как только я установилПовторите попытку виджета, чтобы скрыть.Нужно ли перехватывать какое-то событие, чтобы сделать это?

Ответы [ 5 ]

16 голосов
/ 18 марта 2010

Функция adjustSize может делать то, что вы хотите.

6 голосов
/ 27 января 2013

Вот базовый пример, который автоматически изменяет размер при скрытии / показе виджета.

файл dialog.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtGui>

class dialog : public QDialog
{
    Q_OBJECT


public:
    explicit dialog(QWidget *parent = 0)
    {

        vlayout.addWidget(&checkbox);
        vlayout.addWidget(&label);
        label.setText("Label");

        setLayout(&vlayout);
        this->layout()->setSizeConstraint(QLayout::SetFixedSize); // !!! This is the what makes it auto-resize

        checkbox.setChecked(true);
        connect(&checkbox,SIGNAL(toggled(bool)),&label,SLOT(setVisible(bool)));
    }

private:
    QVBoxLayout vlayout;
    QCheckBox checkbox;
    QLabel label;

};

#endif // DIALOG_H

и main.c

#include <QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    dialog d;
    d.show();
    return a.exec();
}
4 голосов
/ 23 февраля 2012

Это тот, на который я только что разработал ответ !!! (Примечание: это будет дано в форме PyQt4)

Мне нужна была возможность изменить размер окна моего приложения при отображении и скрытии дополнительных панелей. Однако в прошлом я просто переконфигурировал пользовательский интерфейс и / или рабочий процесс, чтобы изменение размера окна не было необходимым. Однако теперь это необходимо.

Окно может быть изменено в размерах при создании. Размер окна может быть изменен напрямую (например, self.resize (xSize, ySize) Однако, если вы создаете несколько строк кода, которые захватывают необходимые размеры, скрывают нужный раздел, пересчитывают, каким должен быть размер, изменение размера, по-видимому, вообще не требуется.

(пример)

curHgt = self.size().height()
curWth = self.size().width()
myFrmHgt = self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
self.resize( curWth, (curHgt - myFrmHgt ) )

Ничего. Не работает Почему нет?

Сегодняшняя охота за ответом все еще не принесла жизнеспособного ответа. Есть несколько предложений для вариантов. Выследить иерархию виджетов, сделать недействительными, настроить размер. Довольно исчерпывающее колебание компоновки, которое просто не будет работать, если вы пытаетесь изменить размер главного окна. Был также ошеломляющий ответ, сказав, чтобы установить ограничение на FixedSize. Но это скорее побеждает всю цель, вроде как сказать, чтобы отрезать руку на запястье, если у вас есть гвоздь.

Однако я наткнулся на кого-то, кто имел некоторый успех в копании и обнаружении, что причина, по которой изменение размера не вступает в силу, из-за очереди Отправленных Событий, которая сбросит изменение размера.

Его решением было запустить QApplication.sendPostedEvents () непосредственно перед изменением размера приложения, чтобы события в очереди не сбрасывали ваше окно. И да и нет. Да, это решение, и я уверен, что есть более красивый способ сделать это, но сначала вам нужно по-настоящему встряхнуть очередь, как вымытый валик.

Вот мой простой фрагмент, который я настроил, и который пока мне кажется надежным.

result = [ self.size().width(), self.size().height() ]
if self.ui.reviewFrm.isVisible():
    result[1] -= self.ui.reviewFrm.size().height()
    self.ui.reviewFrm.hide()

    while self.size().height() > result[1]:
        self.appy.sendPostedEvents()
        self.resize( result[0], result[1] )

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

3 голосов
/ 19 января 2011

Моя проблема немного отличалась тем, что у меня был QWidget верхнего уровня (вместо QDialog или QMainWindow), у которого были дочерние элементы в макете. Когда эти дети изменяли размеры до больше , QWidget изменял размеры, чтобы приспособиться, но не тогда, когда они становились МАЛЕНЬКИМИ. Как и выше, в этом районе было пустое место. Я наконец нашел решение:

Макет, используемый в моем QWidget, имел свойство setSizeConstraint (). Обычно это значение равно «QLayout :: SetDefaultConstraint», что просто влияет на «минимальный размер» QWidget, которому он принадлежит. Вместо этого я выбрал «QLayout :: SetFixedSize», который заставил макет настроить размер fixed владельца QWidget, фактически сделав его МЕНЬШЕ, когда это необходимо.

0 голосов
/ 05 апреля 2019

Если вы хотите изменить размер виджета после установки QLayout::SetFixedSize, вам также необходимо переопределить QWidget::resizeEvent().

void resizeEvent(QResizeEvent* event) override {
    QWidget::resizeEvent(event);
    layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};
...