【问题标题】:The case of the disappearing QWidgetsQWidgets消失的案例
【发布时间】:2013-09-14 20:02:57
【问题描述】:

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

【问题讨论】:

    标签: qt qt5 qtabwidget


    【解决方案1】:

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

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

    还可以在似乎缺少其子级的任何QObject 上尝试qDebug() << wgt->dumpObjectTree();。这会让您知道它是否与育儿变化有关。

    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

    希望对您有所帮助。

    【讨论】:

    • 嗨,谢谢你的提示,这很有帮助。你最终引导我找到解决方案。调用setVisible(true) 无效;但是,我创建了一个计时器来调用show(),并且效果很好。 QTimer::singleShot(20, wgt, SLOT(show())); // force children to re-appear
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多