Невозможно удалить виджеты в под-макете макета в Qt

c++ qt

271 просмотра

3 ответа

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

У меня недостаточно репутации для добавления изображений, поэтому я загружаю iamges здесь: /files/images/464194.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);
}
...
Автор: Perqin Источник Размещён: 12.11.2019 09:27

Ответы (3)


0 плюса

Решение

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

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

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

void LoginDialog::hideRegister()
{
    ...
    useremailLabel->setVisible(false);
    ...
}
Автор: Miki Размещён: 12.07.2015 05:45

0 плюса

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

Автор: p.i.g. Размещён: 12.07.2015 05:45

0 плюса

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

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

Автор: Kuba Ober Размещён: 13.07.2015 01:52
Вопросы из категории :
32x32