问:如何强制隐藏的小部件来计算其布局?

Chr*_*ris 16 c++ user-interface qt

我想要做的是将qwidget渲染到不同的窗口(手动使用QPainter)

我有一个带有布局和一堆子控件的QWidget(w).w是隐藏的.在显示w之前,没有发生布局计算,这是预期的.

当我打电话时w->render(painter, w->mapToGlobal(QPoint(0,0)),我得到一堆控件都相互重叠.
w->layout()->activate();w->layout()->update()好像什么也没做.

有没有办法强制布局发生而不显示w?

Ton*_*vel 18

在窗口小部件上强制进行布局计算而不在屏幕上显示:

widget->setAttribute(Qt::WA_DontShowOnScreen);
widget->show();
Run Code Online (Sandbox Code Playgroud)

show()通话将迫使布局计算,并Qt::WA_DontShowOnScreen确保部件没有明确地显示.


emk*_*y08 11

一个小窗口的布局计算可以通过调用强制invalidate()随后activate()在其布局,即使控件是隐藏的.这也导致窗口小部件size()sizeHint()函数返回正确和更新的值,即使show()尚未在该窗口小部件上调用.

但是,有必要递归地关注所有子窗口小部件和布局,因为布局重新计算请求不会自动传播给子窗口.

以下代码显示了如何执行此操作.

/**
 * Forces the given widget to update, even if it's hidden.
 */
void forceUpdate(QWidget *widget) {
    // Update all child widgets.
    for (int i = 0; i < widget->children().size(); i++) {
        QObject *child = widget->children()[i];
        if (child->isWidgetType()) {
            forceUpdate((QWidget *)child);
        }
    }

    // Invalidate the layout of the widget.
    if (widget->layout()) {
        invalidateLayout(widget->layout());
    }
}

/**
 * Helper function for forceUpdate(). Not self-sufficient!
 */
void invalidateLayout(QLayout *layout) {
    // Recompute the given layout and all its child layouts.
    for (int i = 0; i < layout->count(); i++) {
        QLayoutItem *item = layout->itemAt(i);
        if (item->layout()) {
            invalidateLayout(item->layout());
        } else {
            item->invalidate();
        }
    }
    layout->invalidate();
    layout->activate();
}
Run Code Online (Sandbox Code Playgroud)