2011-02-17 4 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()을 복용해야했다 한 된 문제를 알아 냈어 전체 너비.