Есть ли событие Qt, когда QLayout завершает переделку геометрии?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Есть ли событие Qt, когда QLayout завершает переделку геометрии?

Сообщение Anonymous »

У меня есть собственный класс, который расширяет 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();
};

Код: Выделить всё

doneGeometry()
затем активирует слот в виджете, который немедленно вычисляет новый путь для графического отображения нового макета. Кажется, это работает, но мне интересно, есть ли более идиоматический способ сделать это в Qt. Другая идея, которая у меня возникла, заключалась в том, чтобы перехватить события QEvent::LayoutRequest и QEvent::Resize и вручную вызвать функцию макета setGeometry() с последующим обновлением пути, но это приводит к ошибкам. поведение.

Подробнее здесь: https://stackoverflow.com/questions/787 ... g-geometry
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»