У меня есть собственный класс, который расширяет QWidget и устанавливает на себя макет вертикального блока, а также дочерние виджеты, которые добавляются к указанному макету. В этом смысле это составной виджет. У меня есть QPainterPath в качестве переменной-члена виджета, которая представляет графическое представление виджета и рисуется в PaintEvent(). Этот путь необходимо обновить в зависимости от положения и размеров дочерних виджетов, которыми управляет макет. Меня предупредили, что не следует размещать вычисления в функции PaintEvent(), поэтому я решил обновить путь до PaintEvent(), но после того, как макет будет вычислен. Однако, насколько мне известно, не существует события, обозначающего завершение расчетов макета. Событие QEvent::LayoutRequest вызывается только перед обновлением макета. Событие QEvent::Resize обычно вызывается после обновления макета, но только если расчет макета был вызван изменением размера виджета. Я ищу событие, которое запускается именно тогда, когда макет завершается, независимо от триггера. До сих пор моей лучшей идеей было расширить класс QVBoxLayout и выдать сигнал после завершения функции setGeometry() макета, поскольку именно тогда виджеты занимают свое окончательное положение:
Код: Выделить всё
class NotifyQVBoxLayout : public QVBoxLayout
{
Q_OBJECT
public:
explicit NotifyQVBoxLayout() : QVBoxLayout() {}
void setGeometry(const QRect &rect) override
{
QVBoxLayout::setGeometry(rect);
emit doneGeometry();
}
signals:
void doneGeometry();
};
затем активирует слот в виджете, который немедленно вычисляет новый путь для графического отображения нового макета. Кажется, это работает, но мне интересно, есть ли более идиоматический способ сделать это в Qt. Другая идея, которая у меня возникла, заключалась в том, чтобы перехватить события QEvent::LayoutRequest и QEvent::Resize и вручную вызвать функцию макета setGeometry() с последующим обновлением пути, но это приводит к ошибкам. поведение.
Подробнее здесь:
https://stackoverflow.com/questions/787 ... g-geometry