В моем случае переопределение heightForWidth () не работает. И кому-то может быть полезно получить рабочий пример использования события resize.
Сначала подкласс qObject для создания фильтра. Подробнее о фильтрах событий.
class FilterObject:public QObject{
public:
QWidget *target = nullptr;//it holds a pointer to target object
int goalHeight=0;
FilterObject(QObject *parent=nullptr):QObject(parent){}//uses QObject constructor
bool eventFilter(QObject *watched, QEvent *event) override;//and overrides eventFilter function
};
Тогда функция eventFilter. Этот код должен быть определен вне определения FilterObject, чтобы предотвратить предупреждение. Благодаря этому ответу.
bool FilterObject::eventFilter(QObject *watched, QEvent *event) {
if(watched!=target){//checks for correct target object.
return false;
}
if(event->type()!=QEvent::Resize){//and correct event
return false;
}
QResizeEvent *resEvent = static_cast<QResizeEvent*>(event);//then sets correct event type
goalHeight = 7*resEvent->size().width()/16;//calculates height, 7/16 of width in my case
if(target->height()!=goalHeight){
target->setFixedHeight(goalHeight);
}
return true;
};
А затем в основном коде создайте FilterObject и установите его в качестве прослушивателя EventFilter для целевого объекта. Благодаря этому ответу.
FilterObject *filter = new FilterObject();
QWidget *targetWidget = new QWidget();//let it be target object
filter->target=targetWidget;
targetWidget->installEventFilter(filter);
Теперь фильтр будет получать все события targetWidget и устанавливать правильную высоту при изменении размера.