2010-11-27 5 views
0

GTK에서는 gtk_container_add()가 GtkVBox 인 창을 사용했습니다. 그런 다음 GtkVBox에 위젯을 압축하여 창에 표시되도록 할 수 있습니다.GtkVBox Qt와 동일

이제 Qt를 사용해보기로 결정했지만 Qt에서이 작업을 수행하는 방법을 알 수 없습니다.

지금 당장 내가 한 것은 QMainWindow를 만드는 것입니다.하지만 한 개의 주요 위젯 만 포장 할 수 있다는 것을 알았습니다. 이는 분명히 상당히 제한적입니다. 그래서 저는 GtkVBox와 같은 것을 만들고 이것을 메인 위젯으로 사용하고 다른 위젯을이 상자에 추가하고 싶었습니다.

Google 검색에서 찾은 것은 Q3VBox 위젯입니다.하지만 원하는대로 보이지만 더 이상 사용되지 않으며 QVBoxLayout입니다.

나는 QVBoxLayout을 사용하려고했지만 이미 레이아웃이 있기 때문에 내 QMainWindow의 레이아웃을 변경할 수 없다고 알려줍니다.

편집 : 여기에 내가 (이 생성자에) 할 방법은 다음과 같습니다

box = new QVBoxLayout; 
setLayout(box) 

그것은 잘 컴파일하지만 런타임 중에,이 콘솔에 인쇄 : 이 QWidget::setLayout: Attempting to set QLayout "" on HCGWindow "", which already has a layout (HCGWindow 내 응용 프로그램의 창입니다 , QMainWindow의 하위 클래스)

Qt의 GtkVBox와 비슷한 것을 어떻게 만들 수 있습니까? 솔루션이 Q3VBox 인 경우 어떻게 사용해야하며 다른 것을 사용해야합니까?

감사

+0

기본 창 레이아웃을 어떻게 변경합니까? 컴파일러가 인쇄하는 오류를 보여줍니다. – werehuman

+0

@werehuman : 편집 된 질문입니다. 런타임에는 컴파일 중에 오류가 표시됩니다. – houbysoft

답변

2

사실, 다음은 Qt documentation에서 제공하는 권장 솔루션입니다.

QVBoxLayout을 만들고 원하는 위젯을 추가해야합니다. 그런 다음, 다른 빈 위젯에 레이아웃을 설정 한 다음이 위젯을 QMainWindow 서브 클래스의 중앙 위젯으로 설정합니다. 다음 코드 예제입니다 : 이제

QWidget* widget1 = new QWidget(); // This could be anything subclassing QWidget. 
QWidget* widget2 = new QWidget(); 

QVBoxLayout* layout = new QVBoxLayout(); 
layout->addWidget(widget1); 
layout->addWidget(widget2); 

QWidget* central = new QWidget(); // Only a containing QWidget. 
central->setLayout(layout); 

this->setCentralWidget(central); 

, 당신은 QMainWindow 서브 클래스가 QVBoxLayout 배열 그 안에 두 QWidgets을 가져야한다.

나는 여기에 어떤 부모도주지 않았 음을 유의하십시오. 당신은 그것을 할 수 있었지만 addWidget 또는 setCentralWidget을 호출하면 위젯 (및 레이아웃)의 소유권이 포함 된 클래스에 제공됩니다.

Qt에 대해 조금이라도 읽으면, 부모가 자식을 파괴하려고 할 때 부모가 그 자식을 파괴 할 수 있음을 알게 될 것입니다.

마지막으로, QMainWindow는 예외이며, 제가 알고있는 바로는 setCentralWidget을 가진 유일한 클래스입니다. QWidget 서브 클래스를 만들려고하면 위의 예제에서와 같이 setLayout을 사용할 수 있습니다.

희망이 도움이됩니다.

+0

감사합니다. 비추천 노트를 살펴본 후에도이 사실을 발견했으며, 필자가 사용한 것입니다. – houbysoft

0

시도 메인 화면의 레이아웃이 레이아웃을 QVBoxLayout 인스턴스를 생성 그것은에 위젯을 추가하고 추가 (대체 할) 수.

참고 QLayout 클래스에는 addLayout 멤버가 없지만 하위 클래스에는 하나의 멤버가 있습니다.

첫째로 당신은 얻을 메인 화면의 레이아웃의 클래스 명을 기억해야합니다

qDebug(this.layout()->objectName); 

그런 다음 윈도우의 레이아웃에 QVBoxLayout를 추가 : 나는 그것이 작동합니다 희망

dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object); 

합니다.