在qscrollarea中显示多个图像

时间:2019-08-05 15:37:59

标签: qt qlabel qscrollarea

我正在开发一个应用程序,在该应用程序中我想要一个可以显示可变数量图像的区域。然后,用户将选择一个图像并将其拖动到模拟显示页面上的某个位置。这个想法是要能够在多个屏幕页面上的特定位置放置各种图像。

我正在寻找在滚动区域中适当缩放的两列或更多列图像。整个应用程序区域是可调整大小的,因此,随着滚动区域中空间的变化,图像的列可能会根据需要增大或缩小。

我尝试了许多与QLabel和QPixmaps一起使用的不同测试运行,但是还没有找到一种使它们很好地协同工作的方法。部分原因是我不了解sizePolicy,QViewports,QSrollarea,sizeHint等关系。

在理解如何在滚动区域中显示可缩放图像方面的任何帮助将不胜感激。

屏幕布局:左侧是图像的滚动区域,右侧是构图区域。

Screen print of display area

void MainWindow::loadImages()
{

#define NCOLS 2
#define MAX_WIDTH 100

    QDir dir = QDir(imageLibrary);
    QStringList allImageFiles = dir.entryList(QStringList("*.jpg"));

    ui->currentLibrary->setText(imageLibrary);
    ui->currentLibrary->setMaximumWidth(MAX_WIDTH);

    ui->scrollArea->setGeometry(0,0,200,200);
    QRect geo_availImagesGeometry = ui->scrollArea->geometry();

    int width = geo_availImagesGeometry.width();   
    int height = geo_availImagesGeometry.height();

    QWidget * viewport = new QWidget;
    ui->scrollArea->setWidget(viewport);
    ui->scrollArea->setWidgetResizable(true);

    QGridLayout * gl = new QGridLayout(viewport);

    QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    for (int i = 0; i < allImageFiles.size(); i++) {
        QString thisfile = imageLibrary + "/" + allImageFiles[i];

        QPixmap pixmap(thisfile);
        QLabel * thisImage = new QLabel();

        //thisImage->setScaledContents(true);   // Tried with and without this statement
        //pixmap.scaledToWidth(width);      // Tried with and without this statement

        thisImage->setSizePolicy(policy);
        thisImage->setPixmap(pixmap.scaled(width , width, Qt::KeepAspectRatio));

        thisImage->setToolTip(allImageFiles[i]);

    //thisImage->setText(allImageFiles[i]);  // ????? Using this causes a segmentation violation

        gl->addWidget(thisImage, i/NCOLS, i % NCOLS);   // Add at row/column in scrollarea

    }

    QRect scrollGeom = viewport->childrenRect();        // Check what
    ui->currentLibrary->setMaximumWidth(scrollGeom.width());    // Set width of library name to width of scroll area

    QList<QLabel *> vplist = viewport->findChildren<QLabel *>();    // Debug -- See what the viewport has to say about sizes

    ui->scrollArea->show();
}

0 个答案:

没有答案