如何使用 QHBLayout 保持宽高比调整子 QLabel(具有 QPixmap)的大小?
How to resize child QLabel (having a QPixmap) with QHBLayout keeping aspect ratio?
我正在父 [=17] 中名为 layout
的 QHBLayout
中动态创建一个名为 label
的 QLabel
(有一个 QPixmap
) =] 由 this
命名,这样 QLabel
图像随父 this
调整大小,但保持原始图像纵横比。
我现在做的是:
QHBoxLayout* layout = new QHBoxLayout(this);
label = new QLabel(str, this); /* This Label is my concern */
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
layout->addWidget(label);
layout->setAlignment(Qt::AlignCenter);
this->setLayout(layout);
layout->setContentsMargins(0,0,0,0);
layout->setSpacing(0);
label->setScaledContents(true);
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
在网上搜索并按照 Qt layouts - Keep widget aspect ratio while resizing 中接受的答案中的建议,我什至尝试创建自己的 MyLabel
class 并定义 sizeHint()
和 resizeEvent(QResizeEvent* event)
如下:
QSize MyLabel::sizeHint() const
{
QSize s = size();
lastHeight = s.height();
lastWidth = s.width();
QSize qs = QLabel::sizeHint();
float ratio = std::min(((float)qs.width())/lastWidth, ((float)qs.height())/lastHeight);
s.setWidth(lastWidth*ratio);
s.setHeight(lastHeight*ratio);
return s;
}
void MyLabel::resizeEvent(QResizeEvent* event)
{
QLabel::resizeEvent(event);
if(lastHeight!=height())
{
updateGeometry();
}
}
但是 label
图像仍然会在不保持宽高比的情况下调整大小。
我在这里错过了什么?
我们将不胜感激任何帮助。
提前致谢。
尝试使用此处列出的 QLabel 的子类:
希望对您有所帮助。
尝试调整图片大小而不是 QLabel
。例如。通过挂起父小部件的 resizeEvent 并执行类似的操作:
const QPixmap* pixmap = label->pixmap();
if (pixmap->width() >= newGeometry.width())
{
QPixmap scaledPixmap = pixmap->scaledToWidth(newWidth, Qt::SmoothTransformation);
label->setPixmap(scaledPixmap);
}
我正在父 [=17] 中名为 layout
的 QHBLayout
中动态创建一个名为 label
的 QLabel
(有一个 QPixmap
) =] 由 this
命名,这样 QLabel
图像随父 this
调整大小,但保持原始图像纵横比。
我现在做的是:
QHBoxLayout* layout = new QHBoxLayout(this);
label = new QLabel(str, this); /* This Label is my concern */
label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
layout->addWidget(label);
layout->setAlignment(Qt::AlignCenter);
this->setLayout(layout);
layout->setContentsMargins(0,0,0,0);
layout->setSpacing(0);
label->setScaledContents(true);
label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
在网上搜索并按照 Qt layouts - Keep widget aspect ratio while resizing 中接受的答案中的建议,我什至尝试创建自己的 MyLabel
class 并定义 sizeHint()
和 resizeEvent(QResizeEvent* event)
如下:
QSize MyLabel::sizeHint() const
{
QSize s = size();
lastHeight = s.height();
lastWidth = s.width();
QSize qs = QLabel::sizeHint();
float ratio = std::min(((float)qs.width())/lastWidth, ((float)qs.height())/lastHeight);
s.setWidth(lastWidth*ratio);
s.setHeight(lastHeight*ratio);
return s;
}
void MyLabel::resizeEvent(QResizeEvent* event)
{
QLabel::resizeEvent(event);
if(lastHeight!=height())
{
updateGeometry();
}
}
但是 label
图像仍然会在不保持宽高比的情况下调整大小。
我在这里错过了什么?
我们将不胜感激任何帮助。 提前致谢。
尝试使用此处列出的 QLabel 的子类:
希望对您有所帮助。
尝试调整图片大小而不是 QLabel
。例如。通过挂起父小部件的 resizeEvent 并执行类似的操作:
const QPixmap* pixmap = label->pixmap();
if (pixmap->width() >= newGeometry.width())
{
QPixmap scaledPixmap = pixmap->scaledToWidth(newWidth, Qt::SmoothTransformation);
label->setPixmap(scaledPixmap);
}