2013-11-18 1 views
1

У меня есть класс, основанный на QWidget, который мне нужно создать из другого объекта.QWidget, созданный в aux-методе, не отображается/ничья

Если я создаю виджет в теле своего класса родительского виджета, это все хорошо:

new NodeWidget(rootItem, this); // this works 

Но когда я использую метод Окс виджет создан, но никогда не обращается.

rootItem->createWidget(this); // internally rootItem does the same thing as above 

Сам метод:

void createWidget(QWidget * target) { 
    if (!_ui) _ui = new NodeWidget(this, target); 
... 
} 

Как я понимаю, оба подхода делают то же самое, но первые один работает, а второй один не делает. Создается конструктор NodeWidget, но виджет не отображается в родительском виджетах, а paintEvent никогда не вызывается. Любые идеи почему?

EDIT: Это, конечно, странно, я заметил, что в следующей строке:

new QPushButton(this); 

работает при вызове в конструктор родительского виджета, но не тогда, когда вызываются из события mousePress. В чем разница?

ответ

0

Вы звоните: показать ( для вашего пользовательского виджета?

Если дочерний виджет создан после того, как его родитель уже показан, родительско-дочерние отношения также не могут показать ребенка, поэтому вам нужно явно вызвать show().

Но когда виджет добавлен в конструктор, родитель еще не показан, а затем, когда показан родительский элемент, он автоматически отображает все дочерние элементы, которые явно не скрыты.

+0

Возможно, я неправильно предположил, что Qt автоматически «покажет» новые виджеты каждый раз, когда пользовательский интерфейс будет перерисован. Будет проверять это сейчас. –

+0

Теперь я получаю ошибку сегментации, когда я вызываю 'show()', я проверяю указатель, возвращаемый с 'new', и он действителен, так что же с segfault? –

+0

Вам нужно отлаживать код, мы не можем догадаться, почему вы получаете ошибку сегментации, если вы не можете исправить его, вам нужно показать больше кода (проверьте неинициализированные/недействительные указатели на экземпляр класса) – Zlatomir