Перейти к содержанию

Владение контролами

Окно удерживает контролы, переданные в add_control(). Контрол ссылается на родителя через weak_ptr. Классы приложения обычно хранят свои shared-ссылки, чтобы обновлять или повторно подключать контролы. remove_control() отсоединяет контрол; при наличии другого shared-владельца он продолжает жить.

Панель — поверхность для рисования, а не контейнер дочерних контролов. Встроенный window может владеть своими контролами. message и tray_icon — отдельные вспомогательные объекты.

Избегайте циклов владения в callback. В частности, не захватывайте shared-указатель контрола в его собственный callback:

auto check = std::make_shared<wui::button>("Remember", [] {}, wui::button_view::checkbox);
check->set_callback([weak = std::weak_ptr<wui::button>(check)] {
    if (auto control = weak.lock()) {
        bool checked = control->turned();
        // Apply checked to application state.
    }
});

При захвате this или ссылок соответствующие объекты должны жить до снятия подписки. Отпишитесь, остановите таймеры и дождитесь worker до уничтожения захваченных данных. Храните диалоги до закрытия. См. потоки.