最奇怪的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“吃肉”问题的主要内容,如果未能解决你的问题,请参考以下文章