我使用QLabel向用户显示更大,动态变化的QPixmap的内容 . 根据可用空间,使这个标签更小/更大会很好 . 屏幕尺寸并不总是与QPixmap一样大 .
如何修改QLabel的 QSizePolicy
和 sizeHint()
以调整QPixmap的大小,同时保持原始QPixmap的宽高比?
我无法修改QLabel的 sizeHint()
,将 minimumSize()
设置为零无效 . 在QLabel上设置 hasScaledContents()
允许增长,但是打破了宽高比...
子类化QLabel确实有帮助,但是这个解决方案只为一个简单的问题添加了太多的代码......
任何聪明的提示如何在没有子类化的情况下完成此任务?
4 回答
要更改标签大小,您可以为标签选择适当的大小策略,例如扩展或最小扩展 .
您可以通过每次更改时保持其宽高比来缩放像素图:
您应该在两个地方添加此代码:
当像素图更新时
在包含标签的窗口小部件的
resizeEvent
中我已经完善了这个缺失的
QLabel
子类 . 它很棒,效果很好 .aspectratiopixmaplabel.h
aspectratiopixmaplabel.cpp
希望有所帮助! (更新
resizeEvent
,根据@ dmzl的回答)我只是使用
contentsMargin
来修复宽高比 .到目前为止对我来说非常适合 . 别客气 .
我尝试使用phyatt的
AspectRatioPixmapLabel
类,但遇到了一些问题:有时我的应用程序进入了无限循环的调整大小事件 . 我在resizeEvent方法中追溯到
QLabel::setPixmap(...)
的调用,因为QLabel
实际上在setPixmap
内调用updateGeometry
,这可能会触发调整大小事件...heightForWidth
似乎被包含的小部件(在我的情况下为QScrollArea
)忽略,直到我开始为标签设置大小策略,显式调用policy.setHeightForWidth(true)
我希望标签永远不会超过原始像素图大小
QLabel
的minimumSizeHint()
的实现为包含文本的标签做了一些魔术,但总是将大小策略重置为默认值,所以我不得不覆盖它那就是说,这是我的解决方案 . 我发现我可以使用
setScaledContents(true)
并让QLabel
处理调整大小 . 当然,这取决于符合heightForWidth
的包含小部件/布局 .aspectratiopixmaplabel.h
aspectratiopixmaplabel.cpp