Изменение размера окна Qt, когда дочерний элемент был удален. - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть окно QWidget, которое содержит QSplitter. У меня есть QStackedLayout (в контейнере QWidget) слева и справа от сплиттера. Основное приложение находится в левой области, что может вызвать QWebViews, чтобы появиться справа. Когда я удаляю правую QWebView, окно пытается изменить размер, но остается на ширине QWebView. Когда я пытаюсь перетащить окно, оно привязывается к левой стороне разделителя.

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

Приведенный ниже код написан на Java с использованием оболочек Jambi. Концепции должны быть такими же в C ++, и я могу перевести любой другой язык, связанный с Jambi, если это необходимо.

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

// The main Window class
public Window() { // #QWidget
    super();
    this.setContentsMargins(0, 0, 0, 0);
    QHBoxLayout mainLayout = new QHBoxLayout(this);
    mainLayout.setContentsMargins(0, 0, 0, 0);

            splitter = new QSplitter();

    QWidget leftContainer = new QWidget();
    QWidget rightContainer = new QWidget();

    leftLayout = new QStackedLayout();
    rightLayout = new RightStackedLayout();
    leftContainer.setLayout(leftLayout);
    rightContainer.setSizePolicy(new QSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Expanding));
    rightContainer.setLayout(rightLayout);

    splitter.addWidget(leftContainer);
    splitter.addWidget(rightContainer);
    splitter.setStretchFactor(0, 0); // do not resize left
    splitter.setStretchFactor(1, 1); // fully resize right
    splitter.setWindowState(WindowState.WindowMaximized);
    mainLayout.addWidget(splitter);
}

public void denyWidthChange() { // when right side is closed, prevent user from resizing horizontally
    this.setSizePolicy(new QSizePolicy(QSizePolicy.Policy.Fixed,QSizePolicy.Policy.Preferred));
    this.splitter.setSizePolicy(new QSizePolicy(QSizePolicy.Policy.Fixed,QSizePolicy.Policy.Preferred));
    this.splitter.updateGeometry();
    this.updateGeometry();

}

public void allowWidthChange() { // when right side open, allow user to expand horizontally
    this.setSizePolicy(new QSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Expanding));
    this.splitter.setSizePolicy(new QSizePolicy(QSizePolicy.Policy.Expanding,QSizePolicy.Policy.Expanding));
    this.splitter.updateGeometry();
    this.updateGeometry();
}

public void adjustSizes(int w, int h) {
    this.resize(w, h);
    this.splitter.resize(w, h);
}


// The RightStackedLayout

public void add(QWidget widget) {
        Application.window.allowWidthChange();
        Application.window.setMinimumWidth(((WebPane)widget).minWidth()+this.rememberWidth); // left side + right side
        QWidget current = this.currentWidget();
        if (current != null) {
            this.rememberWidth = current.size().width(); // remember the user resize preferences
        }

        int idx = this.indexOf(widget);
        if (idx == -1) {
            widget.setMinimumWidth(this.rememberWidth);
            this.addWidget(widget);
        }

        this.setCurrentWidget(widget);
    }


public void remove(QWidget widget) {
    Application.window.allowWidthChange();

    this.removeWidget(widget);
    this.update();
    if (this.count() == 0) {
        Log.debug("Last RightWebPane Closing: Shrinking the window");
        this.rememberWidth = widget.size().width();
        this.activate();
        //((QWidget)this.parent()).resize(0, 0);
        Application.window.setMinimumWidth(((WebPane)widget).minWidth());
        Application.window.adjustSizes(0,Application.window.height());
        Application.window.denyWidthChange();
    }   
}

1 Ответ

0 голосов
/ 18 февраля 2011

Несмотря на то, что у меня до сих пор нет полностью функциональной политики изменения размера, я, по большей части, выяснил проблему, с которой я столкнулся, не принимая во внимание splitter.handleWidth() при попытке вычислить общее количество. ширина.

...