gpt4 book ai didi

c++ - Qt 窗口大小不正确,直到用户事件

转载 作者:可可西里 更新时间:2023-11-01 18:38:15 24 4
gpt4 key购买 nike

我正在创建一个屏幕,用户可以在其中添加某些要在编辑器中使用的图 block ,但是在添加图 block 时,窗口无法正确调整大小以适合内容。除了当我拖动窗口或稍微调整它的大小时,它会立即调整到正确的大小。

enter image description here
当只需拖动窗口时,它就会捕捉到正确的大小。

enter image description here

我尝试使用 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::setGeometryminSize 属性传递给 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com