2012-09-30 14 views
18

To prawdopodobnie najgłupszy problem, jaki kiedykolwiek miałem, ale jestem bardzo zdezorientowany. Próbuję zacząć od układów, ale z jakiegoś powodu nie mogę wymyślić tego.Uzyskiwanie dostępu do układu Qt utworzonego w interfejsie z kodu?

Próbowałem dodać QGridLayout przez plik .ui, przeciągając go do mojego projektu. Ponieważ chcę załadować siatkę z widżetami po załadowaniu, próbowałem użyć obiektu "gridLayout" w pliku "mainwindow.h" zarówno przed/po tym-> setupui() jest wywoływana.

Ponieważ nie mogłem tego rozgryźć, zdecydowałem się po prostu spróbuj utworzyć go od zera przy użyciu kodu, a zamiast tego dodałem do pliku main.cpp. To też się nie wyświetlało, więc zastanawiam się, jak na Ziemi mogę wypełnić siatkę po załadowaniu formularza.

#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

co dokładnie jest problem, są widgety dodajesz nie pojawia się, lub pojawiające się w niewłaściwym miejscu? – cmannett85

+0

Po prostu nie pojawiają się, dopóki nie dodaję ich za pomocą edytora interfejsu użytkownika. W takim przypadku nie mogę uzyskać dostępu do układu za pomocą kodu w celu wypełnienia go. –

Odpowiedz

23

Zakładając, że masz po prostu ustawić QGridLayout w QtDesigner do centralWidget w MainWindow tak:

enter image description here

można uzyskać do niego dostęp w kodzie MainWindow w ten sposób z prawidłowym obiektu Nazwa (tutaj jest GridLayout):

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

Jeśli ustawiono układ w QtDesigner lub w kodzie i chcesz zmienić układ, QWidget Nie pozwolę Ci zainstalować inny, a otrzymasz komunikat o błędzie, jak poniżej:

QWidget :: setLayout: Próba ustawić QLayout „” na MainWindow „MainWindow”, który ma już układ

W takim przypadku należy najpierw usunąć istniejący układ, a następnie zainstalować nowy, jak w powyższym kodzie.

Jeśli chcesz uzyskać dostęp do układu w swojej głównej funkcji można to osiągnąć przez funkcję QObject :: findChild jak ten:

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

Pierwszy podany przykład był tym, co próbowałem jako pierwszy, chociaż nie jestem do końca pewien, jak to wkręciłem. Wierzę, że próbowałem uzyskać do niego dostęp jako "gridLayout" w przeciwieństwie do tego, że jest członkiem "ui". Dziękuję bardzo za wspaniałą odpowiedź i wyczyszczenie tego! –

+0

To nie działa dla mnie (pierwsze rozwiązanie.) Program kompiluje się, ale nie widać widżetu. Jakieś pomysły na debugowanie? – baordog

Powiązane problemy