Небольшая картинка, чтобы изобразить, в чем проблема:
external_widget
+--------------------------------------------------+
| |
| |
| layout_widget |
| +-------------------------------+ |
| | | |
| | [internal_layout] | |
| | | |
| | | |
| | [Some Another Widget] | |
| +-------------------------------+ |
| |
+--------------------------------------------------+
layout_widget
просто QWidget с вертикальной компоновкой. Он содержит другой internal_layout
и еще виджеты.
internal_layout
— макет, где виджеты будут добавлены и удалены в будущем.
external_widget
— просто QWidget без макета, я контролирую положение и размер макета виджета и других виджетов вручную.
Когда я добавляю некоторые виджеты в internal_layout
— отправляет событие LayoutRequest (насколько я знаю, я видел это в исходных кодах Qt). Это событие перехватывается родительским виджетом, и родительский виджет сообщает его макету, что что-то изменилось, что заставляет макет пересчитываться layout_widget
sizeHint () и т. д.
Я правильно понимаю этот процесс?
Проблема в том, что sizeHint () изменился, но мой external_widget
ничего не знает об этом. Я хочу получить уведомление о layout_widget
sizeHint () изменяется. Является ли это возможным?
Я даже пытался сделать это:
external widget ctor:
{
layout_widget->installEventFilter(this);
}
и попытался поймать их
void ...eventFilter(QObject* obj, QEvent* event )
{
if (obj == layout_widget && event == QEvent::LayoutRequest)
{
// TODO;
}
}
и я никогда не попадал в блок «TODO».
Делать layout_widget
отправлять какие-либо события или уведомления о том, что внутри него что-то было изменено, и его размер должен быть изменен, т.е. его sizeHint () был изменен?
Задача ещё не решена.