2012-09-30 9 views
18

Questo è probabilmente il problema più stupido che abbia mai avuto, ma sono estremamente confuso. Sto cercando di iniziare con i layout, ma per qualche motivo non riesco a capire questo.Accesso al layout Qt creato nell'interfaccia utente dal codice?

Ho provato ad aggiungere un QGridLayout tramite il file .ui semplicemente trascinandolo nel progetto. Poiché desidero popolare la griglia con i widget al momento del caricamento, ho provato a utilizzare l'oggetto "gridLayout" nel file "mainwindow.h" sia prima che dopo che this-> setupui() viene chiamato.

Dato che non riuscivo a capirlo, ho deciso di provare a crearlo da zero usando il codice e invece ho aggiunto quanto segue al file main.cpp. Anche questo non è stato visualizzato, quindi mi chiedo come sia possibile popolare la griglia quando il modulo viene caricato.

#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

Qual è esattamente il problema, sono i widgets che si sta aggiungendo che non appare, o apparire nel posto sbagliato? – cmannett85

+0

Non si presentano affatto a meno che non li aggiungo tramite l'editor dell'interfaccia utente, nel qual caso non riesco ad accedere al layout tramite il codice per popolarlo. –

risposta

23

Supponendo, è sufficiente impostare un QGridLayout in QtDesigner al tuo centralWidget nel MainWindow come questo:

enter image description here

è possibile accedervi nel codice MainWindow in quel modo con l'oggetto giusto nome (qui è GridLayout):

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

Se è stato impostato un layout in QtDesigner o nel codice e si desidera modificare il layout, QWidget non ti permettono di installare un altro e si otterrà un messaggio di errore simile a questo:

QWidget :: setLayout: Tentativo di impostare QLayout "" su MainWindow "MainWindow", che ha già un layout

In questo caso devi prima eliminare il layout esistente e poi installare quello nuovo come nel tuo codice sopra.

Se si desidera accedere il layout nella funzione principale è possibile raggiungere questo obiettivo con la funzione QObject :: findChild come questo:

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

Il primo esempio che hai dato è stato quello che ho provato per primo, anche se non sono del tutto sicuro di come ho sbagliato. Credo che stavo cercando di accedervi come "gridLayout" in contrapposizione ad esso come membro di "ui". Grazie mille per l'ottima risposta e chiarendo così! –

+0

Questo non ha funzionato per me (prima soluzione). Il programma viene compilato ma non viene mostrato alcun widget. Qualche idea di debug? – baordog

Problemi correlati