Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Turkish
  4. [solved]Groupbox icinde Layout problemi
Qt 6.11 is out! See what's new in the release blog

[solved]Groupbox icinde Layout problemi

Scheduled Pinned Locked Moved Turkish
8 Posts 2 Posters 4.4k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    bc913
    wrote on last edited by
    #1

    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 Reply Last reply
    0
    • I Offline
      I Offline
      isgursoy
      wrote on last edited by
      #2
      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.

      OS X 10.9.2 / qt-mac-opensource-5.2.0-clang

      1 Reply Last reply
      0
      • B Offline
        B Offline
        bc913
        wrote on last edited by
        #3

        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.

        1 Reply Last reply
        0
        • I Offline
          I Offline
          isgursoy
          wrote on last edited by
          #4

          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.

          OS X 10.9.2 / qt-mac-opensource-5.2.0-clang

          1 Reply Last reply
          0
          • B Offline
            B Offline
            bc913
            wrote on last edited by
            #5

            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...

            1 Reply Last reply
            0
            • I Offline
              I Offline
              isgursoy
              wrote on last edited by
              #6

              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)@

              OS X 10.9.2 / qt-mac-opensource-5.2.0-clang

              1 Reply Last reply
              0
              • B Offline
                B Offline
                bc913
                wrote on last edited by
                #7

                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.

                1 Reply Last reply
                0
                • I Offline
                  I Offline
                  isgursoy
                  wrote on last edited by
                  #8

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

                  OS X 10.9.2 / qt-mac-opensource-5.2.0-clang

                  1 Reply Last reply
                  0

                  • Login

                  • Login or register to search.
                  • First post
                    Last post
                  0
                  • Categories
                  • Recent
                  • Tags
                  • Popular
                  • Users
                  • Groups
                  • Search
                  • Get Qt Extensions
                  • Unsolved