Сжатие QDialog с вызовом функции - PullRequest
0 голосов
/ 03 июня 2011

У меня есть диалог, который создается и управляется центральным приложением. Диалог генерирует виджеты во время выполнения и имеет функцию-член для восстановления диалога по умолчанию, т.е. Кнопка сверху и один виджет внизу. Эта функция восстановления вызывается, пока диалог скрыт. Я могу получить дополнительные виджеты из диалога, но не могу уменьшить сам диалог до его первоначального размера. Вот код, который я использую, имена были изменены, чтобы быть общими.

void Dialogue::restore()
{
    const short RESTORE_WIDTH = 800;
    const short RESTORE_HEIGHT = 200;
    QRect newGeometry(frameGeometry());

    // Remove all old origins
    foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >())
        child->deleteLater();

    // Restore widget to default state
    newGeometry.setWidth(RESTORE_WIDTH);
    newGeometry.setHeight(RESTORE_HEIGHT);
    setGeometry(newGeometry);
    updateGeometry();
    addRuntimeWidget();
}

void Dialogue::addRuntimeWidget()
{
    RuntimeWidget* pWidget(new RuntimeWidget());

    vbxlytDialogue->addWidget(pWidget);
    adjustSize();
    adjustPosition(this);
    pWidget->setFocus(Qt::OtherFocusReason);
}

1 Ответ

2 голосов
/ 04 июня 2011

Полагаю, здесь есть проблема с использованием deleteLater. Дочерние виджеты будут удалены только после того, как вы вернетесь к главному циклу событий, и это произойдет только после того, как restore() завершится (т.е. после того, как вы позвоните adjustSize).

Вы пытались удалить дочерние виджеты из макета, в котором они находятся, перед вызовом deleteLater()?

foreach(RuntimeWidget* child, findChildren< RuntimeWidget* >()) {
  vbxlytDialogue->removeWidget(child);
  child->deleteLater();
}

(Или что-то в этом роде - я просто догадываюсь о типе vbxlytDialogue.)

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