2013-09-14 1 views
1

Я заметил довольно непонятное поведение QTabWidget. Я пытаюсь отсоединить и повторно подключить вкладки, и это работает нормально, за исключением случаев, когда я программно выбираю виджет после его повторного подключения, все его дети исчезают! Об обновлении() или перерисовке() или о чем-либо, похоже, не появляется. Вы можете выбрать другую вкладку и переустановить вкладку «Сломанные», а виджетов - автоматически.Случай с исчезновением QWidgets

Ниже приведен некоторый (сокращенный) код, отображающий проблему.

void MainWindow::test() 
{ 
    auto tab_widget = pimpl->tab_widget; 
    auto sz = tab_widget->size(); 

    auto wgt = tab_widget->currentWidget(); 
    auto tab_text = tab_widget->tabText(tab_widget->currentIndex()); 
    if(wgt == nullptr) 
    return; 


    wgt->installEventFilter(new GenericQEventFilter(wgt, 
     [=] (QObject *obj, QEvent *event) { 
      if(event->type() == QEvent::Close) { 
       printf("Close Event!!!\n"); 
       tab_widget->addTab(wgt, tab_text); 
       tab_widget->setCurrentWidget(wgt); 
       // wgt's children are temporarily invisible 
       wgt->setUpdatesEnabled(true); 
       wgt->repaint(); 
       wgt->update(); 
       qApp->processEvents(); //NOTHING WORKS!!! 
       return true; 
      } 
      return false; 
     })); 
    tab_widget->removeTab(tab_widget->currentIndex()); 
    wgt->setParent(nullptr); 
    wgt->setVisible(true); 
    wgt->raise(); 
    wgt->setFocus(); 
} 

Таким образом, просто чтобы быть ясно, я прикрепление события-Фитлер в отдельном виджет, чтобы забрать OnClose события. Фильтр событий отлично работает, подбирает событие и привязывает виджет к tab_widget; однако, после повторного подключения, все дети невидимы или что-то сумасшедшее.

ответ

0

Вы попробовали adjustSize()? Это произойдет, если по какой-то причине он не рассчитает новый размер и попытается правильно удалить объекты. Выполнение resize() тоже сделает что-то подобное.

http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#adjustSize

попробовать Также qDebug() << wgt->dumpObjectTree(); на любой QObject, который, кажется, не хватает своих детей. Это дало бы вам знать, связано ли это с изменениями родительских прав.

http://qt-project.org/doc/qt-5.1/qtcore/qobject.html#children

http://qt-project.org/doc/qt-5.1/qtdoc/debug.html

http://qt-project.org/doc/qt-5.1/qtcore/qobject.html#dumpObjectTree

http://qt-project.org/doc/qt-5.1/qtcore/qdebug.html#details

И тогда есть также вероятность того, что они находятся в месте, но считается hidden и шоу событие не распространяются вниз. Таким образом, вы можете позвонить show(), чтобы проверить это.

http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#visible-prop

http://qt-project.org/doc/qt-5.1/qtwidgets/qwidget.html#show

И может быть какой-то другой собственностью QTabWidget я не думал сразу. Просмотрите этот список и посмотрите, есть ли другие, которые могут быть связаны.

http://qt-project.org/doc/qt-5.1/qtwidgets/qtabwidget-members.html

Надежда, что помогает.

+0

Привет, благодарю вас за подсказки, это было очень полезно. В конце концов, ты подведешь меня к решению. Вызов 'setVisible (true)' не имел никакого эффекта; однако я создал таймер для вызова 'show()', и это сработало отлично. 'QTimer :: singleShot (20, wgt, SLOT (show())); // заставить детей снова появляться ' – Zendel