2012-08-06 21 views
7

Sto provando a creare un'applicazione GUI.Progettazione GUI Qt a livello di programmazione

La finestra principale, a QMainWindow, contiene 9 etichette con dimensioni fisse e anche la dimensione della finestra principale.

Ho provato a farlo a livello di programmazione senza Qt GUI Designer. Il progetto è costruito senza errori ma non riesco a vedere nessuna etichetta o layout mostrato nella finestra principale. è solo vuoto.

Ecco il mio codice sorgente:

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

} 

naturalmente, la classe viene inizializzato e evocato in main.cpp:

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

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

che tipo di bug sto avendo ??

+2

dimensioni fisse sono una cattiva idea, dato sistema/Dimensioni dei caratteri dipendenti dall'utente, traduzioni ecc. Ad ogni modo, quali sono i valori di wcW e wcH? –

+0

Btw, se salti il ​​setFixedSize sulle etichette, dovrebbe funzionare almeno altrettanto bene. –

+0

questo perché la dimensione dell'immagine catturata dalla webcam ha dimensioni fisse. Le etichette sono i titolari di quelle immagini di cattura –

risposta

4

Il codice seguente funziona correttamente. Il problema era nel codice che non stavi mostrando. Quando si utilizza un QMainWindow, come si è eventualmente ammesso di fare, è necessario impostare il proprio centralWidget con un nuovo widget da costruire.

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

grazie! Ho eseguito il tuo codice e ha funzionato bene. e ho anche imparato che non è la stessa cosa per QMainWindow, che è il mio caso. Io cambio la mia classe in una sottoclasse QWidget ed è OK –

+0

In una 'QMainWindow', devi lavorare con il suo' centralWidget() '. Ho modificato il codice di conseguenza. –

1

È WCwindow una sottoclasse di QMainWindow? In questo caso vi consiglio di togliere il layout dalla finestra nell'editor GUI facendo clic sul pulsante "layout di pausa" nella barra in alto, quindi utilizzare la seguente:

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

grazie! questa è la risposta che stavo cercando. ha colpito il mio problema –

+0

Sei il benvenuto! –

+0

Non riesco a scegliere 2 risposte ?? –

Problemi correlati