Files
2024-02-27 14:55:21 +08:00

313 lines
9.0 KiB
C++

#include "imagereslistview.h"
#include "qimageview.h"
#include "qimagewidget.h"
#include <QThread>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QDebug>
#include <QHeaderView>
#include <QtConcurrent> //异步线程
#include <QFuture>
#include <QFutureWatcher>
#include "toolkit.h"
ImageResListView::ImageResListView(QWidget* parent) : QWidget(parent)
{
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint
| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
SavePath.append(QString::fromUtf8("\\192.168.1.120\\111"));//结果地址 工控机1
SavePath.append(QString::fromUtf8("\\192.168.1.130\\111"));
SavePath.append(QString::fromUtf8("D:/111"));
SavePath.append(QString::fromUtf8("\\192.168.1.120\\Ori"));//原图地址 工控机1
SavePath.append(QString::fromUtf8("\\192.168.1.130\\Ori"));
SavePath.append(QString::fromUtf8("D:/Ori"));
}
ImageResListView::~ImageResListView()
{
if (m_result_List)
{
delete m_result_List;
m_result_List = nullptr;
}
if (m_view)
{
delete m_view;
m_view = nullptr;
}
}
void ImageResListView::initwidget()
{
m_Font.setFamily("Microsoft YaHei");
m_Font.setPixelSize(40);
QString m_style = "QLineEdit{border-with:0;border-style:outset;background:transparent;color:rgb(0,255,0);}";
// 初始化控件
qgraphicsScene = new QGraphicsScene(this);
m_view = new QImageView(this);
m_view->setScene(qgraphicsScene);//Sets the current scene to scene. If scene is already being viewed, this function does nothing.
m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭滑动条
m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
up_label = new QLineEdit(this);
up_label->setStyleSheet(m_style);
up_label->setAttribute(Qt::WA_TranslucentBackground);
up_label->setFixedSize(100, 100);
up_label->setFont(m_Font);
up_label->setAlignment(Qt::AlignCenter);
up_label->setReadOnly(true);
up_label->setText(ok_str);
labptr.reset(up_label);
down_label = new QLineEdit(this);
down_label->setStyleSheet(m_style);
down_label->setAttribute(Qt::WA_TranslucentBackground);
down_label->setText(QString::fromUtf8("SN: "));
down_label->setFont(m_Font);
down_label->setReadOnly(true);
label_ptr.reset(down_label);
m_Font.setPixelSize(20);
m_result_List = new QListWidget(this);
m_result_List->setFont(m_Font);
m_result_List->setSpacing(5);//设置单元项的间距
m_result_List->setFlow(QListView::LeftToRight);//从左到右横向的排列,图片和文字也是从左到右排列
m_result_List->setViewMode(QListView::IconMode);//左到右横向的排列,上图下文模式
//m_result_List->setViewMode(QListView::ListMode);//子项就会从上到下排列,图片和文字是从左到右排列.
//m_result_List->setFlow(QListView::TopToBottom);//子项就会从上到下排列,图片和文字是从左到右排列.
m_result_List->setMovement(QListView::Static);//把列表设置为固定的(不能移动)
m_result_List->setSelectionBehavior(QAbstractItemView::SelectRows);//整行选中
m_result_List->setSelectionMode(QAbstractItemView::SingleSelection);//单选
m_result_List->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑表格
m_result_List->setIconSize(QSize(100, 80));//设置图片的大小
m_result_List->setResizeMode(QListView::Adjust);//设置自动适应布局调整
// 设置控件布局
QHBoxLayout* mainWidgetLayout = new QHBoxLayout(this);
QWidget* mainWidget = new QWidget;
mainWidget->setMouseTracking(true);
mainWidgetLayout->addWidget(mainWidget);
mainWidgetLayout->setMargin(0);
QGridLayout* pLayout = new QGridLayout();
pLayout->addWidget(m_view, 0, 0, 12, 16);
pLayout->addWidget(up_label, 0, 14, 2, 2);
pLayout->addWidget(down_label, 10, 0, 3, 16);
pLayout->addWidget(m_result_List, 12, 0, 4, 16);
mainWidget->setLayout(pLayout);
//QVBoxLayout* pvLayout = new QVBoxLayout();
//pvLayout->addWidget(up_label);
//pvLayout->addWidget(m_view);
//pvLayout->addWidget(down_label);
//pvLayout->addWidget(m_result_List);
//pvLayout->setStretchFactor(up_label, 2);
//pvLayout->setStretchFactor(m_view, 12);
//pvLayout->setStretchFactor(down_label, 2);
//pvLayout->setStretchFactor(m_result_List, 4);
//pvLayout->setContentsMargins(3, 3, 3, 3);
//mainWidget->setLayout(pvLayout);
connect(m_result_List, &QListWidget::currentRowChanged, this, &ImageResListView::changeRowList);
connect(this, &ImageResListView::GetShow, this, &ImageResListView::showText);
}
void ImageResListView::mouseMoveEvent(QMouseEvent* event)
{
setCursor(Qt::ArrowCursor);
}
void ImageResListView::addSN(const QString sn)
{
SN = sn;
down_label->setText(SN);
}
void ImageResListView::changeRowList(int row)
{
if (row != -1 && !search_start)
{
QString path;
QImage* image = new QImage();
image->load(str_resultList.at(row));
if (image->isNull())return;
ShowImage(image);
show_index = row;
}
}
void ImageResListView::getCodeSN(const QString res) {
str_resultList.clear();
QStringList pp = res.split(",");
addSN(pp.at(0));
QString SN = pp.at(0).split("_").at(1);
//time2会显示 invalid 数据无效,未根据设定的格式,设置日期
QStringList times = pp.at(0).split("_").at(0).split("-");
QString day_time = QString("%1-%2-%3").arg(times.at(0), times.at(1), times.at(2));
QString h_time = times.at(3);
for (int i = 0; i < 3; i++) {
auto var = SavePath.at(i);
QString resultDir = QString("%1/%2/%3H/%4").arg(var, day_time, h_time, pp.at(0));
if (!isFileExist(resultDir)) {
qDebug() << "[Error] " << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl;
continue;
}
QStringList imageList = addSubFolderDirectory(resultDir);//日期下所有时间段
str_resultList << imageList;
}
emit GetShow(pp.at(1));
upListview(str_resultList);
}
void ImageResListView::ShowImage(QImage* image)
{
try
{
m_pImage = new QImageWidget(image);
qgraphicsScene->clear();
int nwith = m_view->width();//获取界面控件Graphics View的宽度
int nheight = m_view->height();//获取界面控件Graphics View的高度
m_pImage->setQGraphicsViewWH(nwith, nheight);//将界面控件Graphics View的width和height传进类m_Image中
qgraphicsScene->addItem(m_pImage);//将QGraphicsItem类对象放进QGraphicsScene中
m_view->setSceneRect(QRectF(-(nwith / 2), -(nheight / 2), nwith, nheight));
// ui->graphicsView->setScene(qgraphicsScene);
m_view->setFocus();//将界面的焦点设置到当前Graphics View控件
if (image)
{
delete image;
image = nullptr;
}
}
catch (QString ev)
{
qDebug() << "[Error] " << " ev:" << ev;
}
}
void ImageResListView::setSavePath(const QStringList& path)
{
SavePath = path;
}
void ImageResListView::clearAll() {
m_result_List->clear();//清理列表
qgraphicsScene->clear();
down_label->setText(QString::fromUtf8("SN: "));
up_label->setText(ok_str);
qApp->processEvents();
str_resultList.clear();
}
void ImageResListView::upListview(const QStringList list)
{
emit waitSearch();
m_result_List->clear();//清理列表
qApp->processEvents();
str_resultList.clear();
QFutureWatcher<void>* pwatcher = nullptr;
pwatcher = new QFutureWatcher<void>;
//把扫描到的信息输出
QFuture<void> future = QtConcurrent::run([=]()
{
search_start = 1;
for each (auto resultname in list) {
QStringList np = resultname.split("_");
if (np.last().indexOf(".") != -1) {
QString imgpath = resultname;
QString result = np.last().mid(0, np.last().indexOf("."));
QString station = np.at(np.size() - 5) + "-" + np.at(np.size() - 4);
if (isFileExist(imgpath)) {
QIcon icon(imgpath);
if (!icon.isNull()) {
//存
QListWidgetItem* imgItem = new QListWidgetItem;
imgItem->setTextColor("black");
imgItem->setText(station);
imgItem->setIcon(QIcon(imgpath));//图片路径
imgItem->setSizeHint(QSize(100, 120));
if (result.indexOf(ok_str) == -1) {
imgItem->setBackground(ng_color);
}
else {
imgItem->setBackground(ok_color);
}
m_result_List->addItem(imgItem);
str_resultList.append(resultname);
}
}
}
}
search_start = 0;
//耗时操作
});
connect(pwatcher, &QFutureWatcher<void>::finished, this, [=]()
{
//主线程操作
if (list.size()) {
QString path;
QImage* image = new QImage();
if (show_index >= list.size())show_index=0;
image->load(list.at(show_index));
ShowImage(image);
}
emit waitSearch(false);
qApp->processEvents();
});
pwatcher->setFuture(future);
}
void ImageResListView::showText(const QString result)
{
if (result.indexOf(ok_str) == -1) {
up_label->setStyleSheet("QLineEdit{border-with:0;border-style:outset;background:transparent;color:rgb(255,0,0);}");
}
else {
up_label->setStyleSheet("QLineEdit{border-with:0;border-style:outset;background:transparent;color:rgb(0,255,0);}");
}
labptr->setText(result);
}
int ImageResListView::getSearch() {
return search_start;
}
void ImageResListView::stopSearch()
{
search_start = 0;
QThread::msleep(10);
}