[solved]Groupbox icinde Layout problemi



  • Herkese selam,

    Bir mainwindow uyuglamam var ve 3 tab dan olusuyor. 1. sekme 6 tane groupbox tan olusuyor ve ben uygulamami bu groupboxlarin icine gommek istiyorum.
    Mesela asagidaki kodda, 3. groupbox icine label , lineedit, radiobutton ve 2 push button yerlestirmek isitiyorum. Bunu belli bir duzen icinde yapmak istiyorum ve gridlayout kullanmak istiyorum. Ancak, cesitli problemlerle karsilasiyorum:

    1. 12 ser tane lineedit ve label var bunlari 6 satir ve 4 sutun seklinde groupbox in sol ust tarafina konumlandirmak istiyorum. Siralama soyle, label lineedit lineedit label. Ayrica, bir de bunlara baslik olsun diye iki tane de label yarattim ancak gridlayout kulaninca basliklar ile asagidaki grup arasinda buyuk bosluk olusuyor,
    2. Gridlayout kullandiigmda her seferinde groupbox in asagisina yasliyor her seyi basliklar haric. Her widge in veya gridlayout un groupbox icindeki konumunu kontrol etmenin daha kolay bir yolu var mi? NNe tip fonksiyonlar kullanabilirim.
    3. Ayrica, tuslari gridlayout kullanarak sag en alt kosye yaslamak istedigimde en sagdaki butonnu, groupboz in sol en ust kosesine koyuyor..

    4, Genel anlamda groupbox icindeki layout u duzenlemenin en mantikli yolu nedir? ne gibi araclar isimi kolaylastirir?

    Tesekurler

    @//bcomp_mainwindow.h
    #ifndef BCOMP_MAINWINDOW_H
    #define BCOMP_MAINWINDOW_H
    #include <QMainWindow>
    #include <QWidget>
    #include <QMenuBar>
    #include <QToolBar>
    #include <QStatusBar>
    #include "TabModule.h"

    class bcomp_MainWindow : public QMainWindow
    {
    Q_OBJECT
    public:
    bcomp_MainWindow();

    private:
    // members
    TabModule *member;
    QWidget *centralWidget;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    //functions
    void mainSetup();

    signals:

    public slots:

    };

    #endif // BCOMP_MAINWINDOW_H
    @

    @//bcomp_mainwindow.cpp
    #include <QtGui>
    #include "bcomp_mainwindow.h"

    bcomp_MainWindow::bcomp_MainWindow( )
    {
    mainSetup(); // setup main items
    }

    void :: bcomp_MainWindow :: mainSetup ()
    {
    //Initial Size
    this -> resize(863, 423);
    this -> setMinimumSize(QSize(863, 423));
    this -> setMaximumSize(QSize(16777215, 16777215));
    //Tabs
    member = new TabModule();
    member -> tabWidget = new QTabWidget();
    for (int i = 0; i < member -> NumTabs; ++i) {
    member -> tabs[i] = new QWidget();
    member -> tabWidget->addTab(member -> tabs[i], QString(tr("Button %1").arg(i + 1)));}
    setCentralWidget(member -> tabWidget);

    //Groupboxes for tab1
    for (int i = 0; i <6 ; ++i){
        member -> groupbox[i] = new QGroupBox (member -> tabs[0]);
        member -> groupbox[i] -> setTitle(QString(tr("Grup %1").arg(i + 1)));}
    member -> gridLayout = new QGridLayout(member -> tabs[0]);
    member -> gridLayout -> setSpacing(20);
    member -> gridLayout -> addWidget(member -> groupbox[0] , 0, 0 ,1 ,2);
    member -> gridLayout -> addWidget(member -> groupbox[1] , 1, 0 ,9 ,2);
    member -> gridLayout -> addWidget(member -> groupbox[2] , 0, 2 ,7 ,3);
    member -> gridLayout -> addWidget(member -> groupbox[3] , 7, 2 ,3 ,3);
    member -> gridLayout -> addWidget(member -> groupbox[4] , 0, 5 ,5 ,5);
    member -> gridLayout -> addWidget(member -> groupbox[5] , 5, 5 ,5 ,5);
    member -> tabs[0] -> setLayout(member -> gridLayout);
    //Group of text edidors and labels in groupbox 3
    QString names [18] = {"Header1", "Header2","A","B","C","D","E","F","G","H","I","J","K","L","M","N","R","P"};
    QGridLayout *gLayout = new QGridLayout (member -> groupbox[2]);
    QLabel *labels[14];
    QLineEdit *inputbox[16];
    QRadioButton *radiobutton1 = new QRadioButton(names[16],member -> groupbox[2]);
    QRadioButton *radiobutton2 = new QRadioButton(names[17],member -> groupbox[2]);
    QPushButton *okbutton = new QPushButton(member -> groupbox[2]);
    QPushButton *canbutton = new QPushButton(member -> groupbox[2]);
    

    // QHBoxLayout *hLayout = new QHBoxLayout();

    for(int i = 0; i < 16; ++i){
        labels[i] = new QLabel(names[i],member -> groupbox[2]);
        if (i < 14)
            inputbox[i] = new QLineEdit(member -> groupbox[2]);
    }
    for(int i = 0; i < 26; ++i){
        if (i == 0) //Header 1 (1st row 1 st col)
            gLayout -> addWidget(labels[i], 0,0,1,5);
        else if (i == 1) //Header 2 (1st row 2nd col)
            gLayout -> addWidget(labels[i], 0,5,1,5);
        else if (i >= 2 && i < 8) //1st column
            gLayout -> addWidget(labels[i], i-1,0,1,1);
        else if (i >= 8 && i < 14) //2nd column
            gLayout -> addWidget(inputbox[i-8], i-7,1,1,4);
        else if (i >= 14 && i < 20) // 3rd col
            gLayout -> addWidget(inputbox[i-8], i-13,5,1,4);
        else if (i >= 20 && i < 26) //4 th coll
            gLayout -> addWidget(labels[i-12], i-19,9,1,1);
    }
    gLayout -> addWidget(radiobutton1, 7,0,1,2);
    gLayout -> addWidget(radiobutton2, 7,2,1,2);
    gLayout -> addWidget(labels[14], 8,0,1,1);
    gLayout -> addWidget(inputbox[12], 8,1,1,4);
    gLayout -> addWidget(inputbox[13], 8,5,1,4);
    gLayout -> addWidget(labels[15], 8,9,1,1);
    gLayout -> addWidget(okbutton, 9,10,1,1);
    gLayout -> addWidget(canbutton, 9,11,1,1);
    

    // hLayout -> addWidget(okbutton);
    // hLayout -> addWidget(canbutton);
    // gLayout -> addLayout(hLayout, 10,0,1,1);
    //gLayout -> setMargin(20);
    //gLayout -> setSpacing(10);
    member ->groupbox[2] -> setLayout(gLayout);
    }
    @



    1. Groupbox ile calismanin tum yollarini -> atomuyla gorebilir yaninda da yardim dokumantasyonuna basvurabilirsin. Hicbirimiz Help sekmesinden daha cok sey bilmiyoruz.

    1-2-3) Bir sema cizsen bence daha rahat anlasir, uzerine daha iyi konusuruz. Konu arayuz stratejin ise kodlarin bu asamada degeri yok. Adim adim.



  • Ne yazik ki resim sistem resim yukletmiyor ama kisaca soyle aciklyayayim:

    (Bir dialog veya mainwindow uygulamasi olsun) Bir combobox var ve combobox in hicbir ogesi secili degilken altinda 4 tane lineedit var. amacim, combobox in herhangi bir indexi secilince, ona bagli olarak asagisindaki lineeditlerin sayisi degissin ama genel layouttaki yeri degismesin. Yani, combobox in indexine gore girdi sayim degissin.



  • Galiba istedigin sey icerdeki widget sayisi ne olursa olsun kullandigin layout kendisi icin belirledigin alanda cakili kalsin. Icerdeki alani kac widget varsa bolup paylastirsin onlara ama sinirlarini asmasin ya da daraltmasin.

    Dogru mu anladim? Oyleyse QLayout sinifini yardimdan bir arat. Tum layout'larin babasi o. Bu tur isleri yapan fonksiyonlar orda.
    QLayoutItem sinifi da bu durumlari layout'a yerlestirdigin widget'lar uzerinden yorumlayabilir.

    Konuyu uzatmaktan cekinme. Ekleyeceklerini bekliyoruz.



  • Selamlar,

    Cevabiniz icin tesekkurler. Sizin soylediklerinize ek olarak asil yapmak istedigim: (biraz daha basitlestireyim)

    Bir dialog veya mainwindow uygulamasi. Sadece, bir combobox ve bir vertical layout icinde bulunan 3 lineedit nesnesi. Combobox nesnesinin 2 ogesi var.

    Hicbir oge secili degilken (ya da uygulama baslarken), 3 lineedit nesnesi de kilitli ( disabled) olsun.

    1. Oge secili iken son iki lineedit nesnesi gozukmesin( veya yok olsun) ve sadece 1. Lineedit nesnesi gozuksun ve aktif olsun.( bu arada konumlar dediginiz gibi degismeyecek)
    2. Combobox ogesi secili iken, sadece 3. Lineedit nesnesi gozukmesin ve ilk iki lineedit nesnesi gozuksun ve aktif olsun. ( bu arada konumlar dediginiz gibi degismeyecek)

    Help i cok inceledim cok deneme yaptim ama basarili olamadim...



  • Bu calisiyor. Layout sinirlarina bagli kaliyor.
    @void bc913::baslangictakiDurum()
    {
    ui->lineEdit1->setEnabled(0);
    ui->lineEdit2->setEnabled(0);
    ui->lineEdit3->setEnabled(0);
    }

    void bc913::on_secimCombo_currentIndexChanged(int index)
    {

    switch (index)
    {
    
    case 0:
    
        ui->lineEdit2->hide();
        ui->lineEdit3->hide();
    
        break;
    
    case 1:
        ui->lineEdit2->show();
        ui->lineEdit3->hide();
    
        break;
    
    default:
        break;
    }
    

    }
    @

    Ama tabii ki ornegin lineEdit1 her uc kosuldada farkli yerlerde duruyor. Galiba bunu istemiyorsun sen de. Ama bu ayni noktada cakili kalmasindan kesinlikle daha estetik ve makul bir cozum. Aksini istiyorsan layout kullanmaman yeterli. Layout'in kullanim amacini da ortadan kaldirmis oluyorsun cunku.

    Ha yok ben hem oylesini istiyorum hem oylesini dersen de piksel piksel dovusmen gerekecek. Cok kolay, ama layout'in icindeyken degil. Kullanabilecegin fonksiyonlar:

    @void QLayout::setContentsMargins(int left, int top, int right, int bottom)@

    @bool QLayout::setAlignment(QLayout * l, Qt::Alignment alignment)@

    @bool QLayout::setAlignment(QWidget * w, Qt::Alignment alignment)@



  • Tesekkurler,

    Dediginiz gibi switch - case blogu icinde hide() - show() ile yapilan yaklasim daha mantikli. Sorun cozulmus oldu.

    Simdi, baska bir problemim var onu da baska baslik da soracagim.



  • O zaman basligi guncelleyerek konunun cozuldugunu belirt ki hesaptan duselim. Yeni basligi bekliyoruz :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.