Почему необходим макет для нескольких виджетов, принимающих события?

Я на самом деле пишу модуль в qt ( container) inerhiting, из QWidgetкоторого содержится несколько plots, представляющихgraph, откуда все они inerhit QWidget.

Так что это дано:

  • 1 containerможет иметь :
    • n plots, где каждый из них содержит
    • 1 graph.

У меня было вчера много времени, потраченного на выяснение ошибки.
Случилось так, что только n plots, которые были (для целей отладки) добавлены к контейнеру в его конструкторе, чтобы поймать события paint.

Все plots, которые были добавлены тем же методом, пока containerбыл построен allready, не смогли получить какие-либо события.

позже коллега после того, как я попросил помощи объяснил мне, что мой container(который находится вmainwindow-форме) должен получить asigned макет в Qtdesigner. Я дал ему попробовать и был удивлен, что это действительно решило мою проблему. После добавления динамически сгенерированных plots containerи aswell добавления их в макет все виджеты получали события, как и ожидалось.

Но так как я не смог понять его объяснения и не хочу беспокоить его этим дальше, я спрашиваю его здесь.

Так почему же dynmacially генерируемые виджеты, которые являются дочерними объектами других динамически генерируемых QWidgets требуют, чтобы родитель, который является дочернимmainwindow, имел макет asigned?
И если это не просто исключительный случай, почему он не asigned по умолчанию и дополнительные я не смог найти случаи в интернете, из tohers, имеющих такие проблемы?

1 ответ

  1. Вы, вероятно, видите побочные эффекты перекрывающихся виджетов братьев или, возможно, виджетов с нулевым размером. Все, что делает макет, — это изменяет их размер и гарантирует, что они не перекрываются.

    добавлен в контейнер в его конструкторе, чтобы перехватывать события рисования

    Что вы имеете в виду, когда говорите о» зацеплении » событий рисования, и какое отношение это имеет к конструкторам? Вы утверждаете, что все ваши классы (контейнер, участок и график) являются производными от QWidget. Все они должны реализовыватьсяpaintEvent, если они не предназначены для собственного содержимого, кроме фоновой кисти по умолчанию.

    Я предполагаю, что вы каким-то образом слишком усложняете вещи, но без самостоятельного фрагмента кода, который мы можем скомпилировать, чтобы воспроизвести вашу проблему, мы будем ходить по кругу. Не стесняйтесь смотреть в моих ответах : все они состоят из одногоmain.cpp, иногда с довольно большим количеством функциональности. Почти повсеместно, нет никакого кода, кроме необходимого для демонстрации данной техники. Ваш вопрос должен включать в себя также свернутый, сборный пример.