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)