Вопрос

У меня есть простая иерархия виджетов:GraphWidget -> MotionWidget -> NodeWidget.Я новичок в Qt, поэтому пока не совсем уверен в том, как работают некоторые внутренности.По сути, GraphWidget создает один MotionWidget M и устанавливает М'с родитель для самого себя. 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 );
}

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top