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();
}
}