2012-09-30 21 views
18

Este es probablemente el problema más estúpido que he tenido, pero estoy muy confundido. Estoy tratando de comenzar con los diseños, pero por alguna razón no puedo entender esto.¿Cómo acceder al diseño de Qt creado en la interfaz de usuario desde el código?

He intentado agregar un QGridLayout a través del archivo .ui simplemente arrastrando y soltando en mi proyecto. Como quiero poblar la grilla con widgets al cargar, he tratado de usar el objeto "gridLayout" en el archivo "mainwindow.h" antes/después de invocar this-> setupui().

Como no pude entenderlo, opté por solo intentar crearlo desde cero utilizando el código, y en su lugar agregué lo siguiente al archivo main.cpp. Esto tampoco se mostró, así que me pregunto cómo puedo llenar la cuadrícula cuando se carga el formulario.

#include <QtGui/QApplication> 
#include <QtGui> 
#include "mainwindow.h" 

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

    QGridLayout *grid = new QGridLayout; 

    QLabel *label1 = new QLabel("test"); 
    QLabel *label2 = new QLabel("test 2"); 

    grid->addWidget(label1, 0, 0); 
    grid->addWidget(label2, 0, 1); 
    w.setLayout(grid); 

    w.show(); 
    return app.exec(); 
} 
+0

¿Cuál es exactamente el problema, son los widgets que está agregando que no aparece, o apareciendo en el lugar equivocado? – cmannett85

+0

Simplemente no aparecen en absoluto a menos que los agregue a través del editor de IU, en cuyo caso parece que no puedo acceder al diseño a través del código para rellenarlo. –

Respuesta

23

Suponiendo, se han creado simplemente una QGridLayout en QtDesigner a su centralWidget en el MainWindow así:

enter image description here

puede acceder a él en su código MainWindow de esa manera con el objeto correcto nombre (aquí está GridLayout):

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0); 
} 

Si ha establecido una disposición en QtDesigner o en el código y quiere cambiar el diseño, QWidget No se permitirá instalar otro y obtendrá un mensaje de error como este:

QWidget :: setLayout: El intento de establecer QLayout "" en la MainWindow "MainWindow", que ya cuenta con un diseño

En este caso, primero tiene que eliminar el diseño existente y luego instalar el nuevo como en su código anterior.

Si desea acceder a la disposición en su función principal se puede lograr esto mediante la función QObject :: findChild así:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 

    QGridLayout *gridLayout = w.findChild<QGridLayout*>("gridLayout"); 
    Q_ASSERT(gridLayout); 
    gridLayout->addWidget(new QLabel("hello, the second")); 

    w.show(); 
    return a.exec(); 
} 
+0

El primer ejemplo que diste fue el que intenté primero, aunque no estoy del todo seguro de cómo lo arruiné. Creo que estaba intentando acceder a él como "gridLayout" en lugar de ser miembro de "ui". Muchas gracias por la excelente respuesta y aclarar eso! –

+0

Esto no funcionó para mí (primera solución). El programa se compila pero no se muestra ningún widget. ¿Alguna idea de depuración? – baordog

Cuestiones relacionadas