2012-08-06 20 views
7

Intento crear una aplicación GUI.Qt GUI diseño programáticamente

La ventana principal, una QMainWindow, contiene 9 etiquetas con tamaño fijo y también el tamaño de la ventana principal.

Traté de hacerlo programáticamente sin Qt GUI Designer. El proyecto se construye sin error pero no puedo ver ninguna etiqueta ni diseño en la ventana principal. está en blanco.

Aquí está mi código fuente:

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

} 

por supuesto, la clase se inicializa y evocada en main.cpp:

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

    WCwindow *WCwin = new WCwindow; 

    WCwin->show(); 

    return app.exec(); 
} 

qué tipo de insecto estoy teniendo ??

+2

tamaños fijos son una mala idea, sistema dado/tamaños de fuente dependientes del usuario, traducciones etc. De todos modos, ¿cuáles son los valores de wcW y wcH? –

+0

Por cierto, si se omite el setFixedSize en las etiquetas, debería funcionar al menos tan bien. –

+0

esto se debe a que el tamaño de la imagen capturada desde la cámara web tiene un tamaño fijo. Las etiquetas son los titulares de esas imágenes de captura –

Respuesta

4

El código siguiente funciona bien. El problema estaba en el código que no mostrabas. Cuando utiliza un QMainWindow, como finalmente ha admitido que debe hacer, necesita establecer su centralWidget con un nuevo widget que usted construye.

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

¡gracias! He ejecutado tu código y funcionó bien. y también aprendí que esto no es lo mismo para el caso de QMainWindow, que es mi caso. Cambio mi clase a una subclase QWidget y está OK –

+0

En una 'QMainWindow', debe trabajar con' centralWidget() '. He modificado el código en consecuencia. –

1

Es WCwindow una subclase de QMainWindow? En ese caso, te aconsejaría para eliminar la disposición de su ventana en el editor de interfaz gráfica de usuario haciendo clic en el botón de "diseño de ruptura" en la barra superior, a continuación, utilizar los siguientes:

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

¡gracias! esta es la respuesta que estaba buscando. tocó mi problema –

+0

¡Eres bienvenido! –

+0

No puedo elegir 2 respuestas? –