2012-08-06 16 views
7

Próbuję utworzyć aplikację GUI.Projektowanie GUI Qt programowo

Główne okno, QMainWindow, zawiera 9 etykiet o stałym rozmiarze, a także rozmiar głównego okna.

Próbowałem zrobić to programowo bez Qt GUI Designer. Projekt jest zbudowany bez błędów, ale nie widzę żadnej etykiety ani układu widocznych w głównym oknie. jest po prostu puste.

Oto mój kod źródłowy:

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); 

} 

oczywiście klasa jest inicjowany i wywołał w main.cpp:

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

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

jaką bug ja mającego ??

+2

stałe rozmiary są złym pomysłem, zważywszy systemu/zależne od użytkownika rozmiary czcionek, tłumaczenia itp. W każdym razie, jakie są wartości wcW i wcH? –

+0

Btw, jeśli pominiesz setFixedSize na etykietach, powinno to działać co najmniej tak dobrze. –

+0

dzieje się tak, ponieważ rozmiar przechwyconego obrazu z kamery internetowej ma ustalony rozmiar. Etykiety są uchwytami do przechwytywania obrazów –

Odpowiedz

4

Poniższy kod działa poprawnie. Problem tkwił w kodzie, którego nie pokazywałeś. Kiedy używasz QMainWindow, jak ostatecznie przyznałeś, musisz ustawić jego centralWidget z nowym widgetem, który konstruujesz.

// 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

dziękuję! Uruchomiłem twój kod i działało dobrze. i dowiedziałem się, że to nie jest to samo w przypadku QMainWindow, co jest moim przypadkiem. Zmieniam swoją klasę na podklasę QWidget i jest OK –

+0

W 'QMainWindow', musisz pracować z jego' centralWidget() '. Zmodyfikowałem odpowiednio kod. –

1

Czy WCwindow podklasą QMainWindow? W takim przypadku radzę usunąć układ z okna w edytorze graficznym, klikając przycisk „układ przerwa” w górnym pasku, a następnie kliknąć na poniższy:

//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

dziękuję! to jest odpowiedź, której szukałem. trafił mój problem –

+0

Jesteś mile widziany! –

+0

Nie mogę wybrać 2 odpowiedzi? –

Powiązane problemy