【发布时间】: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