Qt QWidgets消失的案例
我注意到QTabWidget中有一些相当难以理解的行为。我正在尝试分离和重新连接选项卡,这很好,除非在重新连接一个小部件后以编程方式选择它,否则它的所有子部件都会消失!没有关于update()或repaint()或任何使小部件重新出现的内容。您可以选择一个不同的选项卡,然后重新选择“断开”选项卡,子窗口小部件将再次自动显示 下面是显示问题的一些(缩短的)代码Qt QWidgets消失的案例,qt,qt5,qtabwidget,Qt,Qt5,Qtabwidget,我注意到QTabWidget中有一些相当难以理解的行为。我正在尝试分离和重新连接选项卡,这很好,除非在重新连接一个小部件后以编程方式选择它,否则它的所有子部件都会消失!没有关于update()或repaint()或任何使小部件重新出现的内容。您可以选择一个不同的选项卡,然后重新选择“断开”选项卡,子窗口小部件将再次自动显示 下面是显示问题的一些(缩短的)代码 void MainWindow::test() { auto tab_widget = pimpl->tab_widget;
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_小部件;但是,在重新连接后,所有的孩子都看不见或像那样疯狂。您是否尝试过
adjustSize()
?如果出于某种原因,它没有计算新的大小,并尝试正确地放入对象,则会发生这种情况。执行resize()
也会执行类似的操作
还可以尝试qDebug()dumpObjectTree()在任何似乎缺少子对象的QObject
上执行code>。这会让你知道这是否与养育方式的改变有关
还有一种可能性是,它们已经就位,但被认为是隐藏的,并且一个表演活动没有向下传播。因此,您可以显式地调用show()
来检查这一点
可能还有QTabWidget
的一些其他属性,我没有马上想到。查看此列表,看看是否还有其他可能相关的内容
希望能有所帮助。嗨,谢谢你的提示,这非常有帮助。你最终给了我一个解决方案。调用setVisible(true)
无效;但是,我创建了一个计时器来调用show()
,这非常有效<代码>QTimer::单发(20,wgt,插槽(show());//强制子项重新出现