为什么这个可滚动区域不能保持我想要的图像大小?

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);
}