我注意到来自 QTabWidget 的一些相当难以理解的行为。我正在尝试分离和重新附加选项卡,并且效果很好,除非我在重新附加后以编程方式选择一个小部件,它的所有子项都会消失!没有关于 update() 或 repaint() 或任何似乎使小部件重新出现的东西。您可以选择不同的选项卡并重新选择“损坏的”选项卡,然后子小部件将再次自动可见。
下面是一些显示问题的(缩短的)代码。
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;但是,重新连接后,所有的孩子都是隐形的或类似的疯狂。