2010-06-16 5 views
10

QT 위젯을 여러 폼을 포함하는 폼 내부에서 사용하려고합니다. 폼 자체는 윈도우의 중앙 위젯 인 QScrollArea 안에 있습니다. 제 의도는 모든 위젯이 QScrollArea (위젯 내부가 아닌)에서 필요한 스크롤을 수행하며 내부의 위젯은 내용을 보유 할 높이를 자동으로 조정합니다.QT의 QTextEdit을 텍스트 높이에 맞게 조정 : maximumViewportSize()

QTextEdit을 사용하여 높이의 자동 크기 조정을 구현하려고했지만 이상한 문제가 발생했습니다. 난은 QTextEdit의 서브 클래스를 생성하고 이런 힌트 (sizehint)() 재 구현 :

QSize OperationEditor::sizeHint() const { 
    QSize sizehint = QTextBrowser::sizeHint(); 
    sizehint.setHeight(this->fitted_height); 
    return sizehint; 
} 

this->는은 QTextEdit의 "contentsChanged()"신호에 연결되어,이 슬롯을 통해 최신 유지 fitted_height :

this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); 

나는 this post.

을 읽은 후이 방법을했다 :

void OperationEditor::fitHeightToDocument() { 
     this->document()->setTextWidth(this->viewport()->width()); 
     QSize document_size(this->document()->size().toSize()); 
     this->fitted_height = document_size.height(); 
     this->updateGeometry(); 
} 

은 QTextEdit 서브 클래스의 크기 정책은

여기 내 문제가 있습니다 :

QTextEdit가 점차 창을 채우도록 크기가 조정되면 크기가 커지는 것을 멈추고 sizeHint()에서 반환 된 높이에 관계없이 QTextEdit 내에서 스크롤을 시작합니다. 처음에 sizeHint()가 큰 상수를 반환하면 QTextEdit은 매우 커서 QScrollArea 내부에 예상대로 포함됩니다. 그러나 sizeHint가 QTextEdit의 크기를 점차 커지기보다는 점차 커지면 현재 창을 채우고 자라는 대신 스크롤을 시작합니다.

내 sizeHint()가 반환하는 것과 상관없이 QAbstractScrollArea에서 상속 된 maximumViewportSize()에서 반환 된 값보다 큰 QTextEdit의 크기를 절대로 변경하지 않기 때문에이 문제를 추적했습니다. 이것은 viewport() -> maximumSize()와 같은 수는 아닙니다. 그 값을 설정하는 방법을 알아낼 수 없습니다.

QT의 소스 코드를 보면 maximumViewportSize()는 "스크롤 막대에 유효한 스크롤 범위가없는 것처럼 뷰포트의 크기"를 반환합니다. 이 값은 기본적으로 위젯에서 현재 크기 (2 * frameWidth + margin)와 스크롤바 폭/높이를 더한 값으로 계산됩니다. 이것은 나에게 많은 의미가되지 않으며, 그 번호가 하위 클래스의 sizeHint() 구현을 대체하는 방식으로 사용되는 이유는 분명하지 않습니다. 또한, 단일 "frameWidth"정수가 너비와 높이를 계산하는 데 사용된다는 것이 이상하게 보입니다.

누구든지이 문제에 대해 알려주시겠습니까? 나는 QT의 레이아웃 엔진에 대한 나의 가난한 이해가 여기에 있다고 비난한다.

편집 : 처음에이 게시물을 게시 한 후 maximumViewportSize()를 다시 구현하여 sizeHint()와 같은 것을 반환 할 생각이 들었습니다. 불행하게도, 나는 여전히 같은 문제를 가지고 있기 때문에 이것은 효과가 없습니다.

답변

8

이 문제가 해결되었습니다.나는 그것이 작동하도록하기 위해해야 ​​할 일을했을 두 가지가 있었다 :

  1. 위젯 계층 구조를 걸어 확인하는 것이 한 모든 크기의 정책을 확인 그 자식 위젯은 작은/큰 일하기를 원한다면, 부모 위젯은 같은 것으로되기를 원할 것입니다.

  2. 이것은 수정 프로그램의 주요 출처입니다. QTextEdit는 QScrollArea의 메인 위젯 인 QFrame 안에 있기 때문에 QScrollArea는 "widgetResizable"속성이 true가 아닌 한 내부 위젯의 크기를 조정하지 않는다는 제약 조건이 있습니다. 그 문서는 여기에 있습니다 : http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop. 이 설정으로 놀아서 작동시키지 않으면 문서가 나에게 명확하지 않습니다. 문서에서 보면이 속성은 기본 스크롤 영역에서 위젯 크기를 조정하려는 시간 (즉, 부모에서 자식까지) 만 처리하는 것으로 보입니다. 실제로는 스크롤 영역의 기본 위젯이 크기를 조정하려는 경우 (즉, 자식에서 부모로)이 설정을 true로 설정해야합니다.

그래서 이야기의 도덕은은 QTextEdit 코드 힌트 (sizehint)를 오버라이드 (override)에 정확하다고하지만 QScrollArea은 메인 프레임의 힌트 (sizehint)에서 반환 된 값을 무시했다.

야! 그것은 작동합니다!

+0

찾아 주셔서 감사합니다. 확실히 나중에 도움이 될 것입니다. –

+2

Aaron, 솔루션에 대해 자세히 설명해 주시겠습니까? QTextEdit와 연결된 QScrollArea에 액세스 할 수없는 것 같습니다. QTextEdit에서 widgetResizable 속성을 설정 한 것을 설명 할 수 있습니까? 그들이 어떻게 연결되어 있는지? QTextEdit는 실제로 setWidgetResizable 속성이없는 QAbstractScrollArea에서 파생됩니다 (Qt 4.7에 있음). 고마워. 정말 날 귀찮게! – Dave

+0

@supertwang 당신은 비슷한 질문 [내 대답] (http://stackoverflow.com/questions/11851020/a-qwidget-like-qtextedit-that-wraps-its-height-automatically-to-)을 확인하고 싶을 수도 있습니다. 그 내용/13599165 # 13599165). – laurasia

0

QTextEditminimumSize 속성을 설정하면 레이아웃이 커지도록 설정할 수 있습니다.

Qt의 레이아웃 구성표 중 대부분을 이해할 수는 없지만 최소 및 최대 크기 설정은 내가 원하는 것을 거의 수행합니다. 어쨌든, 대부분의 시간.

+0

답을 보내 주셔서 감사합니다, 스티븐. minimumSize, maximumSize 및 fixedSize (해당하는 QSizePolicy와 함께)의 모든 조합을 설정하려고했지만 어느 것도 차이를 만들지 않았습니다. – Aaron

관련 문제