как уничтожить макет, прежде чем мы перестроим его Qt c ++ - PullRequest
0 голосов
/ 22 октября 2018

У меня небольшая проблема с отображением моих макетов.У меня есть приложение, которое содержит GridLayout, HBoxLayout и VBoxLayout.

HBoxLayout содержит: кнопку и строку редактирования. GridLayout содержит: progbars (1-99)

HBoxLayout и GridLayoutпомещаются в VBoxLayout

Моя проблема заключается в том, что когда я нажимаю, на HBoxLayout появляется сетка.Похоже, что HBoxLayout не был частью VBoxLayout.Таким образом, даже когда я уничтожаю макет и создаю его снова, у меня остается та же проблема.Изображение показано ниже, чтобы лучше понять мою проблему.

enter image description here

enter image description here

код: window.cpp

    Window::Window(QWidget *parent) :
    QWidget(parent){
    label = NULL;
    progressbar = NULL;
    workerThread = NULL;
    m_counter = NULL;

    layout = new QHBoxLayout(NULL);
    lineEdit = new QLineEdit(NULL);
    m_button = new QPushButton("click", NULL);
    time= new QTimer(this);

    lineEdit-> setInputMask("00");;
    //lineEdit->setGeometry(400,10,160,30);
    lineEdit->setPlaceholderText("N between 1 & 99");

    // Create and position the button
    // m_button->setGeometry(100, 10, 150, 30);

    QIcon icon("/home/ca/Downloads/chauvin.png");
    m_button->setIcon(icon);
    m_button->setIconSize(QSize(100, 30));
    m_button->setToolTip("this is a beautifull button ");

    //layout = new QFormLayout;
    layout->addWidget(m_button);
    layout->addWidget(lineEdit);
    setLayout( layout );

    // showTime();
    time->start(1000);
    setWindowTitle(tr("Digital Clock"));


    // NEW : Do the connection
    connect(m_button, &QPushButton::pressed, this , &Window::slotButtonPressed);}

void Window::slotButtonPressed(){
     layoutgrid = new QGridLayout(NULL);
     m_button->setEnabled(true);
     QString contenu = lineEdit->text();
     int i_contenunumber= contenu.toInt(0,10);
     m_counter= new int[i_contenunumber];
     memset( m_counter, 0, i_contenunumber );
     label = new QLabel*[ i_contenunumber ];
     progressbar = new QProgressBar*[ i_contenunumber ];
     workerThread= new mythread*[ i_contenunumber ];

     int x= 0;
     int y= -1;
     int i=0;
     m_button->setText("Checked");

     for(i=0;i< i_contenunumber ;i++)
     {
        if (i%5==0)
        {
            x=0;
            y++;
        }


     int i_Randomvalue = rand() % 500 + 100;

        //        label[i] = new QLabel(NULL);
        //        //label[i]->setGeometry(100*x*1.7, 80+(50*y), 160, 30);
        //        label[i]->setText("Tread" + QString::number(i_Randomvalue));
        //        label[i]->setVisible(true);

        progressbar[i] = new QProgressBar(NULL);
        progressbar[i]->setRange(0, 100);
        progressbar[i]->setOrientation(Qt::Horizontal);
        //progressbar[i]->setGeometry(100*x*1.7,60+(50*y),150,30);
        progressbar[i]->setValue(0);
        progressbar[i]->setVisible(true);
        layoutgrid->addWidget(progressbar[i],y,x);
        setLayout(layoutgrid);

        workerThread[i] = new mythread(i_Randomvalue, i);

        connect(workerThread[i], &mythread::signalemit, this, &Window::barprogress);enter code here
        connect(workerThread[i], &mythread::signalFinThread, this, &Window::findethread);

        workerThread[i] ->start();

        x++;

        m_counter[i]=0;
    }
    //    Window::setFixedSize(1000,120+(50*y-1));

      removeLayout();

      layoutvbox = new QVBoxLayout(NULL);
      layoutvbox->addLayout(layout);
      layoutvbox->addLayout(layoutgrid);
      setLayout(layoutvbox);
      adjustSize();

}



void Window::removeLayout ( void )
{
    QLayout* po_l_layout = QWidget::layout ();
    if (po_l_layout != 0)
    {
        QLayoutItem *item;
        while ((item = po_l_layout->takeAt(0)) != 0)
            po_l_layout->removeItem (item);
        delete po_l_layout;
    }
}

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

удалить макет здесь не будет, потому что он не удалит все содержащие виджеты

Вместо этого просто создайте новый виджет, содержащий макет

m_widget = new QWidget();
QGridLayout *outerLayout = new QGridLayout(m_widget);
m_layout->addWidget(m_widget);
this->setLayout(m_layout);

, для удаления и перестройки просто удалитеwidget

delete m_widget

удаление виджета удаляет все вложенные макеты и виджеты, содержащиеся в виджете

0 голосов
/ 22 октября 2018

После настройки макета вашего виджета вы не сможете изменить его, если не удалите старый макет.Я предлагаю удалить старый макет

//remove all of layouts widgets here
delete layout

Затем создайте QVBoxLayout и вызовите setLayout(layoutvbox)

Если вы хотите переключаться назад и вперед, просто создайте заново / удалите при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...