horizontal - Qt 레이아웃, 위젯 크기가 변경된 후 최소 크기로 조정




qt horizontal layout example (3)

기본적으로 QGridLayout 에 몇 가지 위젯이 있습니다. 중요한 것은 화면에 이미지를 그리는 데 사용하는 2 개의 레이블입니다. 글쎄, 사용자가 원하는 경우 들어오는 이미지의 해상도를 변경할 수 있으므로 레이블의 크기가 강제 변경됩니다.

라벨의 초기 크기가 320x240 이라고 가정 해 보겠습니다. 사용자가 VideoMode를 640x480 변경하면 레이블과 전체 GUI 크기가 완벽하게 조정됩니다. 그러나 사용자가 320x240 다시 전환하면 라벨이 축소되지만 레이아웃 / 창은 축소되지 않습니다.

나는 sizePoliciessizeHints 가지고 sizePolicies resize(0,0) 했지만 아무것도하지 않았다. 누군가가 이걸 도와 줄 수 있니?

다음은 문제를 설명하는 몇 가지 스크린 샷입니다.


QLayout :: setSizeConstraint (QLayout :: SetFixedSize)는 위젯의 크기를 항상 고정시켜 두는 것을 선호 할 때이 문제를 잘 해결합니다. 즉, 항상 "포장 된"크기로 고정시키고 싶을 때 (여전히 하위 위젯이 크기를 변경함에 따라 다름). 그것이 바로 "고정 된"의미입니다 : "고정 된"올바른 크기로, 심지어 후자가 다릅니다. (Qt 용어로, 나는 "포장 된"크기를 단순히 위젯의 크기 힌트라고 부릅니다.)

그러나 어떤 경우 제약 조건이 너무 강해서 해결책이 될 수 없습니다. 특히 최상위 창에 적용하면 사용자가 창 크기를 자유롭게 변경할 수 없습니다. 그다지 마음에 들지 않으면, "크기를 sizeHint로 설정"작업을 필요할 때마다 즉각적으로 수행 할 수 있습니다. 그 방법은 QWidget :: adjustSize ()를 호출하는 것입니다.

http://doc.qt.io/qt-5/qwidget.html#adjustSize

아이의 크기가 변경되고있는 컨테이너가 톱 레벨의 윈도우가 아닌 경우, adjustSize ()를 컨테이너와 그 부모상에서 재귀 적으로 호출 할 필요가있는 것에주의 해주세요. (필자의 경우 필자는 이것을해야만했다. 또한 크기 제한 스키마를 시도했는데, 최상위 레벨에서만 제약 조건을 적용하면 모든 레벨을 압축하는 데 성공했다는 것을 알게되었다. Qt에 대한 지식이 충분하지 않아 유용하다고 언급하지 못했다. 이 관측에, 그래서 나는 그 (것)들을 단순히 공유한다.)


그래서 제가 mu 프로젝트에서하는 일입니다. 해결 방법은 중요하지 않습니다. 난 비디오 렌더링을위한 위젯이나 당신의 경우에 이미지를 가지고있다.

void MainWindow::resizeEvent(QResizeEvent* event)
 {
   QMainWindow::resizeEvent(event);
   if ((player != 0) && ((player->isPlaying()) || player->isLoaded() || player>isLoaded())){
     renderer->resize(ui->mainVideoWidget->width(),ui->mainVideoWidget->height());
     resizeFilter();

 }
}

모든 위젯을 포함하는 레이아웃의 크기 제한을 "SetFixedSize"로 설정해야합니다. 이름이 작동하는 것처럼 들리지는 않지만 레이아웃에서 필요한 공간 만 사용하도록합니다. 두 번째 스크린 샷에서와 같이 문제가 발생하지 않습니다.

예:

mainLayout.setSizeConstraint(QLayout::SetFixedSize);