【问题标题】:Why does this scrollable area not keep the wanted size of my images?为什么这个可滚动区域不能保持我想要的图像大小?
【发布时间】:2018-12-21 17:07:05
【问题描述】:

我开发了一个 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);
  }

但这给出了这样的结果:

这还不错,但似乎图像的缩放方式可以将所有图像都放入该区域的“物理”大小中。事实上,如果我增加列数(这里的列数是 10,最后两行中的分母),我会得到图像被压缩(真的很奇怪),看起来滚动条实际上​​从来没有用过(所有内容总是堆叠到一个固定大小的窗口中)。

我想要的是具有固定、方便大小的图像,无论要显示的图像数量或配置(行数和列数)如何,如果需要查看图片,它可以在 scrollArea 内滚动.

感谢帮助

编辑:在第一个答案之后,这就是我所拥有的。我还是不能滚动...

【问题讨论】:

  • 什么是flowLayout
  • @eyllanesc 编辑谢谢。其实就是我上面提到的网格布局
  • 如果图像的尺寸不同,显示的 QLabel 的尺寸是多少?
  • 它并不介意@eyllanesc。实际上,我认为标签 setGeometry 属性设置了它,不是吗?
  • 如果你使用的是qlayout,geometry它没有任何影响,因为qlayout的任务是管理geometry

标签: c++ qt qt5 qscrollarea qgridlayout


【解决方案1】:

首先布局不应该设置在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);
}

【讨论】:

  • 实际上,这就像一个魅力!我忘记删除 SetGeometry,这就是为什么我得到如此丑陋的结果!非常感谢!!!!
  • @MysteryGuy 我们建议您首先尝试我们建议的解决方案,无需修改,出于某种原因,我们删除某些部分,保留一些并添加其他部分。如果您的代码与我们提供给您的代码不同,则输出可能会有所不同。这将节省我们所有的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2016-12-13
  • 2019-10-28
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多