Почему QWidget :: paintEvent не вызывается? - PullRequest
2 голосов
/ 12 марта 2009

У меня есть простая иерархия виджетов: GraphWidget -> MotionWidget -> NodeWidget. Я новичок в Qt, поэтому я не совсем уверен в том, как работают некоторые внутренности. По сути, GraphWidget создает один MotionWidget M и устанавливает себе родителя M's . M затем уходит и создает кучу NodeWidgets. Однако NodeWidgets никогда не рисуются, и при этом их функция paintEvent () не вызывается.

Я попытался создать MotionWidget напрямую, без GraphWidget, и все работает. Так почему же все сломается, если я добавлю GraphWidget в иерархию?

Вот вставка с соответствующими битами кода из моего проекта. Я также включил вывод GraphWidget :: dumpObjectTree () вверху.

Редактировать: забыл включить ссылку для вставки;) http://rafb.net/p/Zp39CF94.html

Обновление: я обернул MotionWidget в макет.

До:

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    MotionWidget *n = new MotionWidget( 5, this );
}

После

GraphWidget :: GraphWidget( QWidget *parent ) : QWidget( parent )
{
    setFixedSize( 500, 500 );

    QVBoxLayout *l = new QVBoxLayout;

    MotionWidget *n = new MotionWidget( 5 );

    l->addWidget( n );

    setLayout( l );
}

Теперь последнее работает. То есть все обращается. Тогда возникает вопрос ... Почему? Почему это не сработало в первом случае, но сработало во втором?

1 Ответ

3 голосов
/ 13 марта 2009

Я собираюсь не согласиться с ответом Аиуа . Передача родительского объекта, добавит дочерний элемент в визуальную иерархию. (В противном случае использование Designer для создания виджета, включая другие, но с абсолютным позиционированием, не сработает.) Однако, возможно, были другие факторы, препятствующие рисованию.

Из-за того, что макет заставил все работать, я собираюсь предположить, что в обеих версиях MotionWidget не имеет установленного размера. В первом примере это будет означать, что он будет иметь размер 0x0 пикселей, который Qt оптимизирует при попытке рисования. Во втором примере макет управляет размером добавляемых в него виджетов, и поэтому увеличивается MotionWidget, и, таким образом, он снова начинает получать события рисования.

Чтобы исправить это, вы могли бы установить размер явно, как вы делаете для GraphWidget, или вы могли бы сделать некоторые динамические размеры в зависимости от размера родителя, или GraphWidget мог бы контролировать размер, или любой из большого числа различные варианты. Макеты тоже могут быть хорошими, но не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...