【问题标题】:Resizing a Qt window when a child element has been removed.移除子元素后调整 Qt 窗口的大小。
【发布时间】:2011-02-17 23:59:12
【问题描述】:

我有一个QWidget 窗口,其中包含一个QSplitter。我在分离器的左侧和右侧都有一个QStackedLayout(在QWidget 容器内)。主应用程序位于左侧区域,可以触发QWebViews 出现在右侧。当我删除右边的QWebView 时,窗口会尝试调整大小,但会保持在QWebView 的宽度。当我尝试拖动窗口时,它会捕捉到拆分器左侧的位置。

我希望窗口在从右侧删除最后一个小部件QStackedWidget 时快速返回以仅显示拆分器的左侧。我尝试了各种咒语,但我不太了解 Qt,并且正在尝试边做边学。

以下代码使用 Jambi 包装器使用 Java 编写。 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();
    }   
}

【问题讨论】:

    标签: qt resize window qwidget qsplitter


    【解决方案1】:

    虽然我还没有制定功能齐全的调整大小政策,但我大部分时间都在解决我在尝试计算总数时没有考虑到 splitter.handleWidth() 的问题宽度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2019-11-13
      相关资源
      最近更新 更多