我有一个设计器表单(无按钮的对话框模板),其中包含QScrollArea
和2个QPushButton
对象的垂直布局。我想在QLabel
内用像素图设置QScrollArea
。
这是我的代码:
在Viewer
m_imageLabel = new QLabel;
m_imageLabel->setPixmap(image);
m_imageLabel->setScaledContents(true);
ui->scrollArea->setBackgroundRole(QPalette::Dark);
ui->scrollArea->setWidget(m_imageLabel);
ui->scrollArea->setWidgetResizable(true);
插槽
void Viewer::on_zoomInButton_clicked()
{
m_imageLabel->resize(m_scaleFactor * m_imageLabel->pixmap()->size());
...
}
问题是,当点击zoomInButton
时,什么也没有发生。
如何实现?
答案 0 :(得分:0)
通过使用ui->scrollArea->setWidgetResizable(true);
,您可以允许滚动区域自动调整窗口小部件的大小:
如果将此属性设置为true,则滚动区域将自动调整窗口小部件的大小,以避免在可以避免滚动条的地方使用滚动条,或者利用多余的空间。
此外,您以错误的方式计算了QLabel
的新大小,即您使用了pixmap
的大小,而该大小又保持不变。
为了达到理想的效果,我建议您:
将widgetResizable
属性明确设置为false
:
ui->scrollArea->setWidgetResizable(false);
使QLabel
的新大小取决于其旧大小,而不是其pixmap
的大小:
m_imageLabel->resize(m_scaleFactor * m_imageLabel->size());
这是我为您准备的一个最小示例,目的是演示如何实现建议的解决方案:
#include <QApplication>
#include <QWidget>
#include <QBoxLayout>
#include <QPushButton>
#include <QScrollArea>
#include <QLabel>
struct Viewer : public QWidget
{
explicit Viewer(QWidget *parent = nullptr) :
QWidget(parent)
{
auto *l = new QVBoxLayout(this);
auto *scrollArea = new QScrollArea(this);
auto *btnZoomIn = new QPushButton(tr("Zoom In"), this);
auto *btnZoomOut = new QPushButton(tr("Zoom Out"), this);
auto *label = new QLabel();
qreal scaleFactor = 1.25;
label->setPixmap(QPixmap("qt-creator-logo.png"));
label->setScaledContents(true);
scrollArea->setBackgroundRole(QPalette::Dark);
scrollArea->setWidget(label);
scrollArea->setWidgetResizable(false);
l->addWidget(scrollArea);
l->addWidget(btnZoomIn);
l->addWidget(btnZoomOut);
connect(btnZoomIn, &QPushButton::clicked, [label, scaleFactor](){
label->resize(scaleFactor * label->size());
});
connect(btnZoomOut, &QPushButton::clicked, [label, scaleFactor](){
label->resize((2 - scaleFactor) * label->size());
});
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Viewer w;
w.show();
return a.exec();
}
注意:此代码要求test image qt-creator-logo.png
在运行时位于构建文件夹中。
根据编写,此代码将产生以下结果: