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 イベントを取得するために、切り離されたウィジェットに event-fitler をアタッチしています。イベント フィルターは正常に機能し、イベントを取得して、ウィジェットを tab_widget に再接続します。ただし、再接続すると、すべての子供が見えなくなるか、そのようなクレイジーなものになります。