最奇怪的Qt Layout“吃肉”问题

Posted

技术标签:

【中文标题】最奇怪的Qt Layout“吃肉”问题【英文标题】:Weirdest Qt Layout "flesh eating" problem 【发布时间】:2011-07-15 20:22:28 【问题描述】:

我正在编写自己的类,非常类似于工具栏,其中将包含小部件,位于其内部的水平框布局对象下。

我有一个小部件类作为容器 我有一个派生自 QPushButton 的小部件类,用于自定义绘画(实际上在 pos 0,0 处显示加载的图像)。

我初始化一个布局对象:

this->buttonLayout = new QHBoxLayout(this);
this->buttonLayout->setContentsMargins(0, 0, 0, 0);
this->buttonLayout->setSpacing(0);
this->buttonLayout->setObjectName("buttonsLayout");

然后我开始初始化小部件并将它们“添加”到类似于这样的布局中:

// once button is created.. add it...
this->buttonLayout->addWidget(button);

最后,我创建了一个间隔对象,以确保我的所有工具栏按钮都向左对齐。

QSpacerItem * spacerItem = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding);
this->buttonLayout->addItem(spacerItem);

我的按钮类在构造函数中定义了一个“setMinimumSize”,这在调试器下是正确的。它还重新定义了在运行时调用的“hintSize”,并且值是正确的。

我的问题是这个。我在工具栏上加载了 3 个“按钮”。都有不同的尺寸。 如果布局上的 Spacing 为 0,前两个按钮将被截断 9 个像素!但第三个按钮没问题。 如果布局间距为 -1,按钮会以可变大小很好地显示,但它们之间会有两个像素的空间(我不想要任何空间)。最后,如果布局间距为“9”,一切都会正常显示。

为什么间距“0”会弄乱按钮布局导致覆盖?数字“9”从何而来?当间距为“0”时,为什么前两个按钮(例如,除了最后一个按钮之外的所有按钮)都被截断了 9 个像素?

我在任何地方都找不到答案。

附加信息:

我把它缩小到这个:

对于每个按钮类,我加载了一个 QImage。 hintSize 返回它的大小,在调试器下是正确的。返回的大小与 Photoshop 对图像的描述以及图像的属性对图像的描述相匹配...

然而,在工具栏上,在布局之后,它总是被赋予它的宽度“- 9”!!!所以右边的下面的按钮总是画在它上面,隐藏左边按钮的 9 x 高度像素。

如果我在按钮类的 sizeHint 中手动添加“+9”,则效果很好。

我不明白问题出在哪里。在布局和水平间隔之间的某个地方,像素被“窃取”了,我不知道这里到底发生了什么。

有没有人遇到过这样的事情?为什么我必须从每个按钮“预窃取” 9 个像素以使布局完美?

【问题讨论】:

只是一个猜测,但您是否调查过 frameSize() 返回的内容? 按钮类的邮政编码,以及什么平台。 (Mac OS X 的 QPushButton 派生类存在一些愚蠢的间距问题。) @Dave,你能告诉我更多关于 OSX 下的问题吗? Qt 知道吗? bugreports.qt.nokia.com/browse/QTBUG-14591 【参考方案1】:

解决方案:

这似乎是 OSX 下已知的 Qt 问题。请注意以下错误报告:https://bugreports.qt.io/browse/QTBUG-14591

分辨率:

通过为每个按钮设置 Qt::WA_LayoutUsesWidgetRect 属性。

【讨论】:

以上是关于最奇怪的Qt Layout“吃肉”问题的主要内容,如果未能解决你的问题,请参考以下文章

9patch 导致奇怪的 layout_height 问题

Qt一个很奇怪的问题求解答

Qt: 自动调整到最合适的大小(不是很明白)

初学Qt,label长度改变,窗口大小怎么自动调整

我用 QT4.7 调用了 showMaximized(),出现了一个奇怪的问题

OpenGL顶点属性指针奇怪的行为