2012-09-30 23 views
18

Muhtemelen sahip olduğum en saçma problem, ama çok kafam karıştı. Layouts'u kullanmaya çalışıyorum ama bir sebepten dolayı bunu anlayamıyorum.UI'de yaratılan Qt Düzenine koddan erişme?

Sadece QGridLayout'u .ui dosyası aracılığıyla projemde bırakarak sürükleyerek eklemeyi denedim. Yüklendikten sonra ızgaraları widget'larla doldurmak istediğim için, "mainwindow.h" dosyasındaki "gridLayout" nesnesini, this-> setupui() çağrılmadan önce/sonra kullanmaya çalıştım.

Bunu çözemediğimden, kodu kullanarak sıfırdan oluşturmayı denedim ve bunun yerine main.cpp dosyasına aşağıdakileri ekledim. Bu da görünmüyordu, bu yüzden yeryüzünde nasıl yüklendiğimi ızgaraya yerleştirebileceğimi merak ediyorum.

#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

, sen görünmüyor ekliyoruz widget bulunmaktadır, ya da yanlış yerde mi görünmek? – cmannett85

+0

Sadece UI düzenleyicisinden ekleme yapmadıkça hiç görünmüyorlar, bu durumda düzeni yerleştirmek için kod aracılığıyla erişemiyorum. –

cevap

23

, sadece böyle MainWindow daki centralWidget için QtDesigner bir QGridLayout belirledik varsayarak:

enter image description here

Doğru nesne ile o şekilde MainWindow kodunda erişebileceği ad (işte burada GridLayout):

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0); 
} 
Eğer QtDesigner veya kodunda bir düzen kurduysanız

ve düzenini değiştirmek istiyorum, QWidget Başka birini yükleyin ve alacak izin vermez böyle bir hata iletisi:

QWidget :: setLayout: "Zaten bir düzene sahip" MainWindow üzerinde "MainWindow", QLayout ayarlanmaya çalışılıyor

Bu durumda, önce mevcut düzeni silmeniz ve sonra yukarıdaki kodunuza benzer şekilde yeni bir tane yüklemeniz gerekir. Eğer ana işlevi düzenini erişmek istiyorsanız

böyle QObject :: findChild işleviyle bunu başarabilirsiniz: Tam olarak sorun nedir

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

Verdiğin ilk örnek, ilk önce ne denediğimi göstermese de, onu nasıl batırdığımdan emin değilim. "UI" üyesi olmak yerine "gridLayout" olarak erişmeye çalıştığımı düşünüyorum. Büyük tepki için çok teşekkürler ve bunu temizleyin! –

+0

Bu benim için işe yaramadı (ilk çözüm.) Program derleniyor ama hiçbir widget gösterilmiyor. Herhangi bir hata ayıklama fikri? – baordog