为什么这个可滚动区域不能保持我想要的图像大小?
Why does this scrollable area not keep the wanted size of my images?
我开发了一个 Qt 应用程序。我用 Qt Designer 构建了一个表单。重要的是我有一个像这样的滚动区域:
<widget class="QScrollArea" name="scrollArea">
<property name="geometry">
<rect>
<x>299</x>
<y>50</y>
<width>631</width>
<height>441</height>
</rect>
</property>
<property name="widgetResizable">
<bool>false</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>639</width>
<height>429</height>
</rect>
</property>
</widget>
然后,在我的表单中,我首先为我的 QscrollArea 设置布局:
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
gridLayout = new QGridLayout;
ui->scrollArea->setLayout(gridLayout);
}
然后,我想在这个ScrollArea里面添加50张图片和每张图片的进度条(我其实是在做多媒体检索)
for (int i=0;i<50;i++)
{
QLabel * L = new QLabel;
L->setScaledContents(true);
QProgressBar *dist=new QProgressBar;
L->setGeometry(250,150, 100, 100);
dist->setGeometry(250,150,100,100);
L->setObjectName("lab" + (i+1));
dist->setObjectName("d" + (i+1));
QString chemin ="my_path"+QString::fromStdString(im[i])+".jpg";
QPixmap image(chemin);
L->setPixmap(image.scaled(L->size()));
if((n_algo==2||n_algo==4)&&index_2==0)
dist->setValue(p[i]*100);
else if ((n_algo==2||n_algo==4)&&index_2==2)
dist->setValue(p[i]/p[0]*100);
else
dist->setValue(100-(p[i]*100));;
gridLayout->addWidget(L, 2*(i/10),i%10);
gridLayout->addWidget(dist,2*(i/10)+1,i%10);
}
但这给出了这样的东西:
这还不错,但似乎图像的缩放方式可以将所有图像放入 "physical" 大小的区域中。事实上,如果我增加列数(这里的列数是 10,最后两行中的分母),我得到的图像被压缩了(给某事真的很奇怪)而且看起来滚动条实际上从来没有用过(所有内容始终堆叠成固定大小 window)。
我想要的是具有固定、方便大小的图像,无论要显示的图像数量或配置(行数和列数)如何,如果需要查看,它可以在 scrollArea 内滚动图片。
感谢帮助
编辑:在第一个答案之后,这就是我所拥有的。我仍然无法滚动...
首先,布局不应该设置在QScrollArea中,而是在scrollAreaWidgetContents中:
gridLayout = new QGridLayout;
ui->scrollAreaWidgetContents->setLayout(gridLayout);
ui->scrollArea->setWidgetResizable(true);
然后您必须为 QLabel 设置固定大小:
QSize s(128, 128);
for (int i=0; i<50; i++)
{
QLabel *L = new QLabel;
L->setScaledContents(true);
QProgressBar *dist=new QProgressBar;
L->setObjectName(QString("lab%1").arg(i+1));
dist->setObjectName(QString("d%1").arg(i+1));
QString chemin ="my_path"+QString::fromStdString(im[i])+".jpg";
QPixmap image(chemin);
L->setPixmap(image);
L->setFixedSize(s);
if((n_algo==2||n_algo==4)&&index_2==0)
dist->setValue(p[i]*100);
else if ((n_algo==2||n_algo==4)&&index_2==2)
dist->setValue(p[i]/p[0]*100);
else
dist->setValue(100-(p[i]*100));
QVBoxLayout *lay = new QVBoxLayout;
lay->setContentsMargins(0, 0, 0, 0);
lay->addWidget(L);
lay->addWidget(dist);
gridLayout->addLayout(lay, i/10, i%10);
}
我开发了一个 Qt 应用程序。我用 Qt Designer 构建了一个表单。重要的是我有一个像这样的滚动区域:
<widget class="QScrollArea" name="scrollArea">
<property name="geometry">
<rect>
<x>299</x>
<y>50</y>
<width>631</width>
<height>441</height>
</rect>
</property>
<property name="widgetResizable">
<bool>false</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>639</width>
<height>429</height>
</rect>
</property>
</widget>
然后,在我的表单中,我首先为我的 QscrollArea 设置布局:
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
gridLayout = new QGridLayout;
ui->scrollArea->setLayout(gridLayout);
}
然后,我想在这个ScrollArea里面添加50张图片和每张图片的进度条(我其实是在做多媒体检索)
for (int i=0;i<50;i++)
{
QLabel * L = new QLabel;
L->setScaledContents(true);
QProgressBar *dist=new QProgressBar;
L->setGeometry(250,150, 100, 100);
dist->setGeometry(250,150,100,100);
L->setObjectName("lab" + (i+1));
dist->setObjectName("d" + (i+1));
QString chemin ="my_path"+QString::fromStdString(im[i])+".jpg";
QPixmap image(chemin);
L->setPixmap(image.scaled(L->size()));
if((n_algo==2||n_algo==4)&&index_2==0)
dist->setValue(p[i]*100);
else if ((n_algo==2||n_algo==4)&&index_2==2)
dist->setValue(p[i]/p[0]*100);
else
dist->setValue(100-(p[i]*100));;
gridLayout->addWidget(L, 2*(i/10),i%10);
gridLayout->addWidget(dist,2*(i/10)+1,i%10);
}
但这给出了这样的东西:
我想要的是具有固定、方便大小的图像,无论要显示的图像数量或配置(行数和列数)如何,如果需要查看,它可以在 scrollArea 内滚动图片。
感谢帮助
编辑:在第一个答案之后,这就是我所拥有的。我仍然无法滚动...
首先,布局不应该设置在QScrollArea中,而是在scrollAreaWidgetContents中:
gridLayout = new QGridLayout;
ui->scrollAreaWidgetContents->setLayout(gridLayout);
ui->scrollArea->setWidgetResizable(true);
然后您必须为 QLabel 设置固定大小:
QSize s(128, 128);
for (int i=0; i<50; i++)
{
QLabel *L = new QLabel;
L->setScaledContents(true);
QProgressBar *dist=new QProgressBar;
L->setObjectName(QString("lab%1").arg(i+1));
dist->setObjectName(QString("d%1").arg(i+1));
QString chemin ="my_path"+QString::fromStdString(im[i])+".jpg";
QPixmap image(chemin);
L->setPixmap(image);
L->setFixedSize(s);
if((n_algo==2||n_algo==4)&&index_2==0)
dist->setValue(p[i]*100);
else if ((n_algo==2||n_algo==4)&&index_2==2)
dist->setValue(p[i]/p[0]*100);
else
dist->setValue(100-(p[i]*100));
QVBoxLayout *lay = new QVBoxLayout;
lay->setContentsMargins(0, 0, 0, 0);
lay->addWidget(L);
lay->addWidget(dist);
gridLayout->addLayout(lay, i/10, i%10);
}