- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在创建一个屏幕,用户可以在其中添加某些要在编辑器中使用的图 block ,但是在添加图 block 时,窗口无法正确调整大小以适合内容。除了当我拖动窗口或稍微调整它的大小时,它会立即调整到正确的大小。
我尝试使用 resize(sizeHint());这给了我一个不正确的大小和以下错误,但是在调整大小/拖动时仍然会捕捉到正确的大小。
QWindowsWindow::setGeometry: Unable to set geometry 299x329+991+536 on QWidgetWindow/'TileSetterWindow'. Resulting geometry: 299x399+991+536 (frame: 8, 31, 8, 8, custom margin: 0, 0, 0, 0, minimum size: 259x329, maximum size: 16777215x16777215).
我也尝试过使用 updateGeometry() 和 update(),但它似乎并没有起到什么作用。
当将窗口设置为 fixedSize 时,它会立即调整大小,但用户无法再调整窗口大小。我在这里做错了什么,我应该从哪里开始解决它?
编辑 Minimal verifiable example和 .ui file .selected_layout 的类型为 Flowlayoutflowlayout_placeholder_1 之所以存在,是因为我无法将 flowlayout 直接放入设计器中。
编辑2这是一个minimal Visual Studio example .我使用 Visual Studio 进行 Qt 开发。我尝试在 Qt Creator 中创建一个项目,但没有成功。
编辑3添加了一个 little video (80 KB)。
编辑4这是 updated Visual Studio example .它具有 jpo38 提出的新变化。它修复了错误调整大小的问题。虽然现在试图缩小窗口会导致问题。如果您尝试减少水平空间,即使有更多行的空间,它们也不会再正确填充垂直空间。
最佳答案
很棒的 MCVE,正是轻松调查问题所需要的。
看起来这个 FlowLayout
类并没有设计成在用户操作时改变它的最小尺寸。当窗口移动时,QWidget 内核会“偶然”更新布局。
我可以通过修改 FlowLayout::minimumSize()
行为让它巧妙地工作,这里是我所做的改变:
FlowLayout
类添加了 QSize minSize;
属性FlowLayout::minimumSize()
以简单地返回此属性doLayout
函数添加了第三个参数 QSize* pMinSize
。这将用于更新此 minSize
属性doLayout
以将计算的大小保存到 pMinSize
参数(如果指定)FlowLayout::setGeometry
将 minSize
属性传递给 doLayout
并在最小尺寸更改时使布局无效然后布局按预期运行。
int FlowLayout::heightForWidth(int width) const {
const int height = doLayout(QRect(0, 0, width, 0), true,NULL); // jpo38: set added parameter to NULL here
return height;
}
void FlowLayout::setGeometry(const QRect &rect) {
QLayout::setGeometry(rect);
// jpo38: update minSize from here, force layout to consider it if it changed
QSize oldSize = minSize;
doLayout(rect, false,&minSize);
if ( oldSize != minSize )
{
// force layout to consider new minimum size!
invalidate();
}
}
QSize FlowLayout::minimumSize() const {
// jpo38: Simply return computed min size
return minSize;
}
int FlowLayout::doLayout(const QRect &rect, bool testOnly,QSize* pMinSize) const {
int left, top, right, bottom;
getContentsMargins(&left, &top, &right, &bottom);
QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
int x = effectiveRect.x();
int y = effectiveRect.y();
int lineHeight = 0;
// jpo38: store max X
int maxX = 0;
for (auto&& item : itemList) {
QWidget *wid = item->widget();
int spaceX = horizontalSpacing();
if (spaceX == -1)
spaceX = wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
int spaceY = verticalSpacing();
if (spaceY == -1)
spaceY = wid->style()->layoutSpacing(QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
int nextX = x + item->sizeHint().width() + spaceX;
if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
x = effectiveRect.x();
y = y + lineHeight + spaceY;
nextX = x + item->sizeHint().width() + spaceX;
lineHeight = 0;
}
if (!testOnly)
item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
// jpo38: update max X based on current position
maxX = qMax( maxX, x + item->sizeHint().width() - rect.x() + left );
x = nextX;
lineHeight = qMax(lineHeight, item->sizeHint().height());
}
// jpo38: save height/width as max height/xidth in pMinSize is specified
int height = y + lineHeight - rect.y() + bottom;
if ( pMinSize )
{
pMinSize->setHeight( height );
pMinSize->setWidth( maxX );
}
return height;
}
关于c++ - Qt 窗口大小不正确,直到用户事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48831898/
我需要在 JavaScript 中的笛卡尔坐标和球坐标之间进行转换。我在论坛上浏览了一下,没有找到我要找的东西。 现在我有这个: this.rho = sqrt((x*x) + (y*y) + (z*
有没有matrix3d可以像这样把矩形变成梯形的?我知道常规的 2d 矩阵变换只能以平行四边形结束,因为您只能有效地倾斜和旋转。 div { width: 300px; height:
关于这个例子(d3.j radial tree node links different sizes),我想知道是否可以在 d3.js 中混合径向树和直线树。 对于我的 jsFiddle 示例:htt
我尽量把标题写得最好,但我不确定如何准确描述这里发生的事情,所以请随时更正。 我想使用 › 直 Angular 引号 (›) 而不是 > 直 Angular 引号 (>),虽然 › 字符比 > 短,但
我正在尝试使用 CSS 创建一个具有圆边的矩形棱柱,如下图所示。 到目前为止,我已经指定了顶部和底部的边界半径。问题是我不知道如何让另一边的左右边缘向内 curl 。因此,拐 Angular 处不应有
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 去年关闭。 社区去年审查了是否重
首先,我刚刚开始学习 HTML 和 CSS。 我想如何使用这段代码: https://codepen.io/martinjkelly/pen/vEOBvL .container { width:
我是一名优秀的程序员,十分优秀!