Подтвердить что ты не робот

Изменение размеров виджетов qt, когда их дети скрыты

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

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

  • обновление()
  • updateGeometry()
  • setGeometry (childrenRect())
  • расположение() → Activate()

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

4b9b3361

Ответ 1

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

Ответ 2

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

файл 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();
}

Ответ 3

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

В макете, используемом в моем QWidget, было свойство, называемое setSizeConstraint(). Обычно это устанавливается как "QLayout:: SetDefaultConstraint", который просто влияет на "минимальный размер" QWidget, который его владеет. Вместо этого я выбрал "QLayout:: SetFixedSize", который заставил макет отрегулировать фиксированный размер владеющего QWidget, эффективно сделав его SMALLER, когда это необходимо.

Ответ 4

Это тот, на который я только что разработал ответ!!! (Примечание: это будет указано в форме 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 ) )

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

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

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

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

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

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] )

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