Почему эта прокручиваемая область не сохраняет требуемый размер моих изображений? - PullRequest
0 голосов
/ 21 декабря 2018

Я разработал приложение 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);

}

затем я хочу добавить 50 изображений и индикатор выполнения для каждого изображения (на самом деле я делаю мультимедийный поиск) внутри этой ScrollArea

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

Но это дает что-то вроде этого:

enter image description here Это не так уж и плохо, но кажется, что изображения масштабируются таким образом, что все можно поместить в «физический» размер области.Действительно, если я увеличу количество столбцов (здесь число столбцов равно 10, знаменатель в двух последних строках), я получу сжатые изображения (что на самом деле странно, что sth), и кажется, что полосы прокрутки фактически никогда не используются(все всегда укладывается в окно фиксированного размера).

Мне бы хотелось, чтобы изображения были фиксированного и удобного размера независимо от количества отображаемых изображений или расположения (количества строк и столбцов), где онобудет иметь возможность прокрутки внутри области прокрутки, если необходимо, чтобы посмотреть на фотографии.

Спасибо за помощь

РЕДАКТИРОВАТЬ: после первого ответа, вот что у меня есть.Я до сих пор не могу прокрутить ... enter image description here

1 Ответ

0 голосов
/ 21 декабря 2018

Прежде всего, макет должен быть установлен не в 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);
}

enter image description here

...