2014-05-24 3 views
0

enter image description hereQVBoxLayout의 영역 크기는 어떻게 얻습니까?

이것은 내가 가지고있는 구조입니다. 표시되는대로 label_2 또는 QVBoxLayout의 전체 크기를 찾고 싶습니다. verticalLayout_2->width()을 사용하면 항상 100을 얻게되고 verticalLayout_2->height()은 항상 30을 반환합니다. Qt Creator에 따르면이 영역이 확장되어 385x379 인 영역을 채울 것으로 생각됩니다.

Doing label_2-width()label_2-height()은 창 크기와 영역에 관계없이 100x30으로 확장됩니다.

+0

당신은 (아마도) 레이아웃이 완전히 완료되기 전에 크기를 검사합니다. 나중에 확인하십시오. – Mat

+0

'ui-> setupUi (this)'다음에는 충분하니? 나중에는 실행중인 프로그램에 들어갑니다. – JVE999

+0

나는 그것이 충분하다고 생각하지 않는다. ['showEvent'] (http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent)를 다뤄보십시오. 레이아웃이 100 %가 아닌 그 시점에서 이루어 졌다고 생각합니다. 오랫동안.) – Mat

답변

0

위젯의 생성자가 실행 된 후에 시각적으로 아무 일도 일어나지 않습니다. setupUi 호출은 생성자에서 발생합니다. 실제 작업은 이벤트 루프가 시작되면 발생합니다.

실제 문제는 임의의 시점을 확인해서는 안된다는 것입니다.을 변경할 때마다 을 확인해야합니다. 이렇게하려면 자신의 레이아웃이 필요합니다. 기존 레이아웃에서 파생되어 다시 구현됩니다. setGeometry. 이 메소드는 부모 위젯 또는 부모 레이아웃이 주어진 레이아웃의 크기를 조정할 때마다 호출됩니다. 이는 유일한 올바른 접근 방식이며이를 달성하기 위해 해킹이 필요하지 않습니다.

는 예를 들어, 다음 클래스는 새로운 기하학이있을 때 신호하는 데 사용할 수 있습니다 :

class SigBoxLayout : public QBoxLayout { 
    Q_OBJECT 
protected: 
    void setGeometry(const QRect & r) Q_DECL_OVERRIDE { 
    if (r != geometry()) emit hasNewGeometry(r); 
    QBoxLayout::setGeometry(r); 
    } 
public: 
    SigBoxLayout(QBoxLayout::Direction dir, QWidget * parent = 0) : 
    QBoxLayout(dir, parent) {} 
    Q_SIGNAL void hasNewGeometry(const QRect & r); 
}; 
관련 문제