2

我注意到来自 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;但是,重新连接后,所有的孩子都是隐形的或类似的疯狂。

4

1 回答 1

0

你试过adjustSize()吗?如果由于某种原因它没有计算新的大小并尝试正确放入对象,则会发生这种情况。执行 aresize()也会做类似的事情。

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

希望有帮助。

于 2013-09-15T04:45:40.103 回答