2011-02-17 107 views
0

我有一個QWidget窗口,其中包含一個QSplitter。我在分離器的左側和右側都有QStackedLayout(在QWidget容器內)。主應用程序位於左側區域,可以觸發QWebViews出現在右側。當我刪除右邊的QWebView時,窗口嘗試調整大小,但保持在QWebView的寬度。當我嘗試拖動窗口時,它會對齊到分離器左側的位置。刪除子元素時調整Qt窗口的大小。

我想讓窗口回到原來的狀態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(); 
    } 
} 

回答

0

雖然我還沒有得到一個全功能的大小調整政策發生的事情,我最的方式想通了,我曾與試圖計算時不採取splitter.handleWidth()考慮到做的問題總寬度。