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