C++ 显示用户选择的源目录中的图像

C++ 显示用户选择的源目录中的图像,c++,qt,user-interface,C++,Qt,User Interface,我有一个Qt应用程序,用户在其中选择包含图像(.pgm文件)(任何数字)的源目录。在UI中, 我创建了一个显示区域(QGroupBox),它有两个QGraphicsview,一次显示两个图像 用户界面图像: 继续, 我想为所有图像创建QGraphicsView小部件,并一次显示其中的两个。右侧将有一个滚动条。 当用户向下拖动滚动条时,其他QGraphicsView小部件 用户可以通过不同的图像看到。如何在C++中使用Qt?< /P> PS:当点击LoadImages按钮时,我可以使用QGrap

我有一个Qt应用程序,用户在其中选择包含图像(.pgm文件)(任何数字)的源目录。在UI中, 我创建了一个显示区域(QGroupBox),它有两个QGraphicsview,一次显示两个图像

用户界面图像:

继续, 我想为所有图像创建QGraphicsView小部件,并一次显示其中的两个。右侧将有一个滚动条。 当用户向下拖动滚动条时,其他QGraphicsView小部件 用户可以通过不同的图像看到。如何在C++中使用Qt?< /P> PS:当点击LoadImages按钮时,我可以使用QGraphicsView小部件在显示区域显示两幅图像

#include "ui_DataViewerPage.h"

#include <iostream>

#include <QGraphicsScene>
#include <QPixmap>
#include <QThread>
#include <QSettings>

#include "DataWorker.h"

namespace Ui
{
    class DataViewerPage;
}
 // This is the main UI thread header and cpp file
class DataViewerPage : public QWidget
{
    Q_OBJECT
public:
    DataViewerPage(QWidget* parent = nullptr);
    virtual ~DataViewerPage();

public slots:
    void on_loadButton_clicked();

    void startWorker();
    void stopWorker();

    void displayImage(QString fileName);
signals:
    void startLoadingImages();

private:
    Ui::DataViewerPage* ui;
    DataWorker* worker;
    QSettings settings;

    // Worker thread handles data processing away from ui thread
    QThread workerThread;
    QSharedPointer<QGraphicsScene> ptr_scene;
    QSharedPointer<QGraphicsScene> ptr_scene2;
    int currentDisplayNum;
};

#include "DataViewerPage.h"

DataViewerPage::DataViewerPage(QWidget* parent)
    : QWidget(parent), worker(nullptr), ui(new Ui::DataViewerPage)
{
    ui->setupUi(this);
    ui->Display->setVisible(true);
    ptr_scene = QSharedPointer<QGraphicsScene>(new QGraphicsScene(this));
    ptr_scene2 = QSharedPointer<QGraphicsScene>(new QGraphicsScene(this));
}

DataViewerPage::~DataViewerPage()
{
    workerThread.quit();
    workerThread.wait();
    workerThread.terminate();
    if (worker)
    {
        delete worker;
    }

    delete ui;
}

void DataViewerPage::on_loadButton_clicked()
{
    ui->Display->setVisible(true);
    ui->loadButton->setDisabled(true);
    emit startLoadingImages();
}


void DataViewerPage::stopWorker()
{
    workerThread.quit();
    workerThread.wait();
    workerThread.terminate();

    if (worker)
    {
        delete worker;
        worker = nullptr;
    }
}

void DataViewerPage::startWorker()
{
    stopWorker();
    worker = new DataWorker();
    worker->moveToThread(&workerThread);

    connect(this, &DataViewerPage::startLoadingImages, worker, &DataWorker::startLoadingImages);
    connect(worker, &DataWorker::displayImage, this, &DataViewerPage::displayImage);

    workerThread.start();
    currentDisplayNum = 0;
}

void DataViewerPage::displayImage(QString fileName)
{
    QPixmap pixelMap(fileName.toStdString().c_str()); // <- path to image file
    switch (currentDisplayNum)
    {
    case 0:
        ptr_scene->addPixmap(pixelMap);
        ui->img1->setScene(ptr_scene.get());
        break;
    case 1:
        ptr_scene2->addPixmap(pixelMap);
        ui->img2->setScene(ptr_scene2.get());
        break;
    default:
        break;
    }
    currentDisplayNum++;
}

// This is the worker thread header and cpp file. 
#pragma once
#include <QThread>
#include <QSettings>
#include <filesystem>

class DataWorker : public QObject
{
    Q_OBJECT
public:
    DataWorker();
    ~DataWorker();

public slots:
    void startLoadingImages();
signals:
    void displayImage(QString fileName);

private:
    QSettings settings;
    std::string path;
};

#include "DataWorker.h"
#include <iostream>
#include <QImage>

DataWorker::DataWorker()
{
    path = settings.value("dataDir").toString().toStdString();
}

DataWorker::~DataWorker()
{
}

void DataWorker::startLoadingImages()
{
    std::cout << "startloadingImages called..." << std::endl;
    int iCount = 0;
    for (const auto& entry : std::filesystem::directory_iterator(path))
    {
        QString imgPath = QString::fromStdString(entry.path().string());
        emit displayImage(imgPath);
        iCount++;
        if(iCount > 1)
            break; // Right now do it for two only.......
    }
}
#包括“ui_DataViewerPage.h”
#包括
#包括
#包括
#包括
#包括
#包括“DataWorker.h”
名称空间用户界面
{
类数据视图页面;
}
//这是主UI线程头和cpp文件
类DataViewerPage:公共QWidget
{
Q_对象
公众:
DataViewerPage(QWidget*parent=nullptr);
虚拟~DataViewerPage();
公众时段:
单击按钮时无效();
void startWorker();
void stopWorker();
无效显示图像(QString文件名);
信号:
void startingimages();
私人:
Ui::DataViewerPage*Ui;
数据工作者*工作者;
QSettings设置;
//工作线程处理ui线程之外的数据处理
QThread-workerThread;
QSharedPointer ptr_场景;
Q共享指针ptr_场景2;
int currentDisplayNum;
};
#包括“DataViewerPage.h”
DataViewerPage::DataViewerPage(QWidget*父项)
:QWidget(父)、worker(nullptr)、ui(新ui::DataViewerPage)
{
用户界面->设置用户界面(此);
用户界面->显示->设置可见(真);
ptr_scene=QSharedPointer(新的qgraphicscene(this));
ptr_scene2=QSharedPointer(新的qgraphicscene(this));
}
DataViewerPage::~DataViewerPage()
{
workerThread.quit();
workerThread.wait();
workerThread.terminate();
如果(工人)
{
删除工人;
}
删除用户界面;
}
void DataViewerPage::on_loadButton_clicked()
{
用户界面->显示->设置可见(真);
ui->loadButton->setDisabled(真);
发出惊人的图像();
}
void DataViewerPage::stopWorker()
{
workerThread.quit();
workerThread.wait();
workerThread.terminate();
如果(工人)
{
删除工人;
worker=nullptr;
}
}
void DataViewerPage::startWorker()
{
停止工人();
worker=newdataworker();
worker->moveToThread(&workerThread);
连接(此,&DataViewerPage::startLoadingImages,worker,&DataWorker::startLoadingImages);
连接(worker,&DataWorker::displayImage,this,&DataViewerPage::displayImage);
workerThread.start();
currentDisplayNum=0;
}
void DataViewerPage::displayImage(QString文件名)
{
QPixmap pixelMap(fileName.toStdString().c_str());//addPixmap(pixelMap);
ui->img1->setScene(ptr_scene.get());
打破
案例1:
ptr_场景2->添加像素地图(像素地图);
ui->img2->setScene(ptr_scene2.get());
打破
违约:
打破
}
currentDisplayNum++;
}
//这是辅助线程头和cpp文件。
#布拉格语一次
#包括
#包括
#包括
类DataWorker:公共QObject
{
Q_对象
公众:
数据工作者();
~DataWorker();
公众时段:
void startingimages();
信号:
无效显示图像(QString文件名);
私人:
QSettings设置;
std::字符串路径;
};
#包括“DataWorker.h”
#包括
#包括
DataWorker::DataWorker()
{
path=settings.value(“dataDir”).toString().tostString();
}
DataWorker::~DataWorker()
{
}
void DataWorker::startLoadingImages()
{

std::cout尝试使用而不是
QGroupBox
将QGroupBox替换为qscrollara不起作用。我要寻找的是,当文件夹中有两个以上的图像时,我想为每个图像创建QGraphicsView,然后将其添加到我的GroupBox或ScrollArea中,并且在右侧会有一个滚动条供用户拖放请看其余的图片