2012-08-06 3 views
7

GUI 응용 프로그램을 만들려고합니다.프로그래밍 방식으로 Qt GUI 디자인

메인 창 QMainWindow에는 고정 크기 및 기본 창의 크기가있는 9 개의 레이블이 있습니다.

Qt GUI 디자이너없이 프로그래밍 방식으로 만들려고했습니다. 프로젝트는 오류없이 작성되었지만 기본 창에 레이블이나 레이아웃이 표시되지 않습니다. 그냥 비어 있습니다. 여기

내 소스 코드 : 물론

WCwindow::WCwindow() 
{ 
    // initialize widgets with text 
    CAM111 = new QLabel("CAM 01"); 
    CAM121 = new QLabel("CAM 02"); 
    CAM131 = new QLabel("CAM 03"); 

    CAM211 = new QLabel("CAM 04"); 
    CAM221 = new QLabel("CAM 05"); 
    CAM231 = new QLabel("CAM 06"); 

    CAM311 = new QLabel("CAM 07"); 
    CAM321 = new QLabel("CAM 08"); 
    CAM331 = new QLabel("CAM 09"); 

    CAM111->setFixedSize(wcW,wcH); 
    CAM121->setFixedSize(wcW,wcH); 
    CAM131->setFixedSize(wcW,wcH); 
    CAM211->setFixedSize(wcW,wcH); 
    CAM221->setFixedSize(wcW,wcH); 
    CAM231->setFixedSize(wcW,wcH); 
    CAM311->setFixedSize(wcW,wcH); 
    CAM321->setFixedSize(wcW,wcH); 
    CAM331->setFixedSize(wcW,wcH); 

    QGridLayout *layout = new QGridLayout; 
    layout->addWidget(CAM111,0,0); 
    layout->addWidget(CAM121,0,1); 
    layout->addWidget(CAM131,0,2); 

    layout->addWidget(CAM211,1,0); 
    layout->addWidget(CAM221,1,1); 
    layout->addWidget(CAM231,1,2); 

    layout->addWidget(CAM311,2,0); 
    layout->addWidget(CAM321,2,1); 
    layout->addWidget(CAM331,2,2); 

    setLayout(layout); 

    setWindowTitle("Camera Window"); 
    setFixedSize(1000, 800); 

} 

, 클래스가 초기화 및 MAIN.CPP에서 유발된다

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

나는 데 버그의 종류 ??

+2

고정 크기는 나쁜 생각입니다/사용자 의존 글꼴 크기, 번역 등 어쨌든, wcW 및 wcH의 값은 무엇입니까? –

+0

Btw, 레이블에서 setFixedSize를 건너 뛸 경우 적어도 정상적으로 작동합니다. –

+0

웹캠에서 캡처 한 이미지의 크기가 고정 크기이기 때문입니다. 라벨은 이미지 캡처 용 홀더입니다 –

답변

4

아래 코드는 정상적으로 작동합니다. 문제는 당신이 보여주지 않은 코드에있었습니다. QMainWindow을 사용하는 경우, 결국 허용 한대로 centralWidget을 새 위젯으로 설정해야합니다. WCwindowQMainWindow의 서브 클래스

// main.cpp 
#include <QVector> 
#include <QMainWindow> 
#include <QLabel> 
#include <QGridLayout> 
#include <QApplication> 

class WCwindow : public QMainWindow 
{ 
public: 
    WCwindow(); 
private: 
    QVector<QLabel*> cams; 
    QLabel* cam(int r, int c) const { 
     return cams[r*3 + c]; 
    } 
}; 

WCwindow::WCwindow() 
{ 
    QGridLayout *layout = new QGridLayout; 

    for (int i = 1; i < 10; ++ i) { 
     QLabel * const label = new QLabel(QString("CAM %1").arg(i, 2, 10, QLatin1Char('0'))); 
     label->setFixedSize(200, 50); 
     layout->addWidget(label, (i-1)/3, (i-1) % 3); 
     cams << label; 
    } 

    QWidget * central = new QWidget(); 
    setCentralWidget(central); 
    centralWidget()->setLayout(layout); 

    setWindowTitle("Camera Window"); 
    setFixedSize(1000, 800); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    WCwindow win; 
    win.show(); 
    return app.exec(); 
} 
+0

감사합니다! 귀하의 코드를 실행했는데 정상적으로 작동했습니다. 그리고 저는 이것이 QMainWindow의 경우에도 동일하지 않다는 것을 알게되었습니다. 클래스를 QWidget 서브 클래스로 바꾼다. 괜찮다. –

+0

'QMainWindow'에서,'centralWidget()'을 가지고 작업해야한다. 그에 따라 코드를 수정했습니다. –

1

인가? 이 경우 상단 막대에서 "레이아웃 끊기"버튼을 클릭하여 GUI 편집기에서 창에서 레이아웃을 제거하고 다음을 사용하는 것이 좋습니다.

//setup all your labels and layout ... 

//creating a QWidget, and setting the WCwindow as parent 
QWidget * widget = new QWidget(this); 

//set the gridlayout for the widget 
widget->setLayout(layout); 

//setting the WCwindow's central widget 
setCentralWidget(widget); 
+0

감사합니다. 이것은 내가 찾고 있던 대답이다. 그것은 내 문제를 쳤다 –

+0

당신은 wellcome입니다! –

+0

2 답을 선택할 수 없습니까? –