2015-07-12 8 views
0

Я использую Qt 5.5.0 для Windows. В диалоговом окне, используемом для входа и регистрации, я использую QVBoxLayout в качестве основного макета диалогового окна и добавляю QGridLayout к mainLayout. Когда я нажимаю кнопку «Зарегистрироваться», он добавит слишком большое количество строк для регистрации, и когда я снова нажму на нее, эти элементы будут удалены. Однако, когда я удаляю виджеты в GridLayout, виджеты все еще существуют, и окно не изменяет размер.Невозможно удалить виджеты в макете макета в Qt

Я не хватает репутации, чтобы добавить изображения, поэтому я загрузить iamges здесь: http://i.imgbox.com/WAS6KAQw.png

Вот некоторые из моего кода, так как удалить виджеты в макет сетки?

LoginDialog::LoginDialog(MainWindow * mw, AgendaService * as, QWidget * parent) 
    // Initialization list 
{ 
    // Manage layouts and UI 
    passwordEdit->setEchoMode(QLineEdit::Password); 
    mainLayout = new QVBoxLayout; 
    editLayout = new QGridLayout; 
    bottomLayout = new QVBoxLayout; 
    editLayout->addWidget(usernameLabel, 0, 0); 
    editLayout->addWidget(usernameEdit, 0, 1); 
    editLayout->addWidget(passwordLabel, 1, 0); 
    editLayout->addWidget(passwordEdit, 1, 1); 
    mainLayout->addLayout(editLayout); 
    QHBoxLayout * buttonLayout = new QHBoxLayout; 
    buttonLayout->addWidget(registerButton); 
    buttonLayout->addWidget(loginButton); 
    bottomLayout->addLayout(buttonLayout); 
    bottomLayout->addWidget(notifyBar); 
    mainLayout->addLayout(bottomLayout); 
    setLayout(mainLayout); 

    // Set default button 
    registerButton->setDefault(false); 
    loginButton->setDefault(true); 

    // Other code 
} 

void LoginDialog::showRegister() 
{ 
    loginButton->setEnabled(false); 
    editLayout->addWidget(useremailLabel, 2, 0); 
    editLayout->addWidget(useremailEdit, 2, 1); 
    editLayout->addWidget(userphoneLabel, 3, 0); 
    editLayout->addWidget(userphoneEdit, 3, 1); 
} 

void LoginDialog::hideRegister() 
{ 
    editLayout->removeWidget(userphoneEdit); 
    editLayout->removeWidget(userphoneLabel); 
    editLayout->removeWidget(useremailEdit); 
    editLayout->removeWidget(useremailLabel); 
    loginButton->setEnabled(true); 
} 
... 

ответ

0

Вы удаляете только макет, а не родительский виджет, поэтому они отображаются в виджетах без «макета».

Попробуйте просто скрыть их setVisible(false) и setVisible(true), чтобы показать их снова.

void LoginDialog::showRegister() 
{ 
    ... 
    useremailLabel->setVisible(true); 
    ... 
} 

void LoginDialog::hideRegister() 
{ 
    ... 
    useremailLabel->setVisible(false); 
    ... 
} 
0

Вы должны использовать один из setHidden(bool), setVisible(bool) функций. Если вы просто используете функцию removeWidget, которую вы сделали, вы удаляете ее только из макета.

0

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

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