当前位置: 首页 > news >正文

QT使用QListWidget显示多张图片

Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、QListWidget 和 QListView 的差异
  • 二、显示效果
    • 1.操作工作区界面
      • 1.主界面头文件
      • 2. 主界面实现界面
    • 2.左边图片目录展示界面
      • 1.图片目录头文件
      • 2.图片目录实现文件
    • 2.属性窗口区
      • 1.属性窗口头文件
      • 2.属性窗口实现文件
  • 3 源码下载

前言

QListWidget类提供了一个基于项目的列表小部件
QListWidget是一个方便的类,它提供了一个列表视图,类似于QListView提供的列表视图,但是具有一个用于添加和删除项的经典基于项的接口。QListWidget使用一个内部模型来管理列表中的每个QListWidgetItem。要获得更灵活的列表视图小部件,请使用带有标准模型的QListView类。列表小部件的构造方法与其他小部件相同。QListWidget与QListView类似,都可以显示一列Item,区别在于前者可以往其中增删Item。
QListWidget确定可以同时选择列表中的多少项,以及是否可以创建复杂的项选择。这可以使用函数设置

一、QListWidget 和 QListView 的差异

QListWidget 是一个更新且更高级的元件,能够更为方便地进行开发,例如 QListWidget 具有 QStantandardItemModel 无法访问的类型,也能更轻鬆的透过 QListWidgetItem 处理数据,然而如果使用 QListView,许多方法必须要额外定义,属于比较旧的使用方式。

QListView、QListWidget是列表形式展示的控件。

QTableView、QTableWidget是表格形式展示控件。

继承关系:带Widget的继承自View,即:QListWidget是继承QListView,QTableWidget继承自QTableView。

区别:QListView是基于Model,而QListWidget基于Item。这是它们的本质区别。QTableView、QTableWidget同理。

由于QListView和QTableView是基于model的,需要自己来建模(例如建立QStringListModel、QSqlTableModel等),保存数据,这样就大大降低了数据冗余,提高了程序的效率,以及能更方便的进行我们自己需要展示的内容,但是需要我们对数据建模有一定了解。

而QListWidget相当于是QListView的升级版,它已经自己为我们建立了一个数据存储模型(QListWidgetItem),操作方便,直接调用addItem即可添加项目(ICON,文字)。QTableView、QTableWidget同理。

二、显示效果

在这里插入图片描述

1.操作工作区界面

1.主界面头文件

#pragma#include "ui_QDockWidgetDemo.h"
#include "MsgBox.h"#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QKeyEvent>#include "propertyWin.h"
#include "projectWin.h"#include "FileMonitorMgr.h"QT_FORWARD_DECLARE_CLASS(QMenu)class QDockWidgetDemo : public QMainWindow
{Q_OBJECTpublic:explicit QDockWidgetDemo(QWidget* parent = nullptr);private slots:void addLog(const QString&);//标题栏槽函数void s_showToolBar();void s_showPorjectWin();void s_showPropertyWin();void s_showLogWin();void s_monitorFile();void s_close();void s_min();void s_hideProj();void s_propertyWinHide(bool);void s_logWinHide(bool);void s_timeout();void s_MonitorFolder();void s_saveFile();void s_runAc();void s_stopAc();void s_debugAc();void s_anaysisAc();void s_recordAc();void s_grabAc();void s_capacityAc();void s_paramterAc();void s_publishAc();void s_exportAc();private:void initTitleBar();void initLogView();void initWorkSpaceView();void initPropertyView();void initProjectView();void initToolBar();void dockLayout();void initMaxMinWin();void initShowImage();void showMessageBox(const QString&);private:Ui::QDockWidgetDemo ui;//标题栏QAction* m_toolBarAc = NULL;QAction* m_projectAc = NULL;QAction* m_logAc = NULL;QAction* m_propertyAc = NULL;//工具栏QAction* m_newAc = NULL;QAction* m_saveAc = NULL;QAction* m_runAc = NULL;QAction* m_stopAc = NULL;QAction* m_debugAc = NULL;QAction* m_anaysisAc = NULL;QAction* m_recordAc = NULL;QAction* m_grabAc = NULL;QAction* m_capacityAc = NULL;QAction* m_paramterAc = NULL;QAction* m_publishAc = NULL;QAction* m_exportAc = NULL;QDockWidget* m_logView = NULL;QDockWidget* m_propertyView = NULL;QDockWidget* m_projManagerView = NULL;QTextEdit* m_logBody = NULL;QWidget* m_maxminWin = NULL;QWidget* m_workspace = NULL;projectWin* m_projectWin = NULL;propertyWin* m_propertyWin = NULL;MsgBox* m_msgBox = NULL;QPushButton* m_minBtn = NULL;QPushButton* m_closeBtn = NULL;//监控文件夹FileMonitorMgr* m_fileMgr;
private:void init();
signals:void sigCommitReconRequest(const QString& strFilePath);void sigInitTree(QStringList fileLst, QString filePath);void sigFilterJpg(QStringList jgpFileLst, QString filePath);protected slots:void slotDirectoryChanged(const QString& strDirectory);void watchFloder(bool flag);void slotShowImgs(QStringList lst, QString path);
private:QStringList GetFileNames(const QFileInfoList& fileInfoList);QStringList getFolderFiles(const QString& path);QStringList fliterJPG(const QString& path);private:QString m_strMonitorDirectory;QStringList m_strListFileNames;QStringList m_allFile;QStringList m_filterJpgImg;QFileSystemWatcher* m_pDirectoryWatcher;QVector<QString> m_changeFiles;QListWidget* m_ImageList;};

2. 主界面实现界面

#include "QDockWidgetDemo.h"#include <QDesktopWidget>
#include <QDebug>
#include <QStandardPaths>
#include <QTimer>
#include <QHBoxLayout>
#include <QSpacerItem>
#include <QFileDialog>
#include <QDir>#pragma execution_character_set("utf-8")Q_DECLARE_METATYPE(QDockWidget::DockWidgetFeatures)QString MenuBarStyle =
"QMenuBar{background-color:#FFFFFF; font:14px; color:#232323;}"
"QMenuBar::item{\min-height:40px; \margin:1 10 0 10px; \padding:10 10 10 10px; /* 条目内边框 */ \background:#FFFFFF; /* 背景颜色 */ \border-radius:4px; /* 倒角 */ \}""QMenuBar::item:selected{background: #E5E5E5; }";QString MenuStyle =
"QMenu{/*整个背景*/}"
"QMenu::item{ \font-size: 14px; \color: rgb(225,225,225);  /*字体颜色*/\border: 3px solid rgb(60,60,60);    /*item选框*/\background-color:rgb(89,87,87); \padding:16px 16px; /*设置菜单项文字上下和左右的内边距,效果就是菜单中的条目左右上下有了间隔*/\margin:0px 2px;/*设置菜单项的外边距*/\}""QMenu::item:selected{background-color:#1E1E1E;/*选中的样式*/}""QMenu::item:pressed{/*菜单项按下效果*/  border: 1px solid rgb(60,60,61); background-color: rgb(220,80,6);}";QString tabBarStyle =
"QTabBar::tab{min-height: 28px;  min-width:80px ;  font:14px; }"
"QTabBar::tab:!selected{}"
"QTabBar::tab:!selected:hover{ background-color: #d9fffe; color: black;}"
"QToolBar{background-color:#e5e5e5; margin:3px;}"
"QToolBar::separator{height:1px; background-color:#000000;}"
"QToolBar QToolButton{min-width:60px; min-height:40px; background-color:transparent;}"
"QToolBar QToolButton:hover{background-color:rgba(255,255,255,0.8);}"
"QToolBar QToolButton:pressed{background-color:rgba(255,255,255,0.5);}"
;QDockWidgetDemo::QDockWidgetDemo(QWidget* parent) : QMainWindow(parent)
{qRegisterMetaType<QDockWidget::DockWidgetFeatures>();ui.setupUi(this);this->setWindowTitle(tr("图像处理"));this->setWindowIcon(QIcon(":/images/logo.png"));this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint);this->setStyleSheet(tabBarStyle);//this->setStyleSheet("QMainWindow::separator {width: 2px;height: 2px;margin: 2px;padding: 2,2px;}");//On the top menu bar add toolbar,menubar and dockwidget.initTitleBar();initToolBar();initLogView();initProjectView();      //项目区初始化在前。initWorkSpaceView();	//工作区初始化在后。initPropertyView();dockLayout();initShowImage();   //显示图片this->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);//This property holds the tab shape used for tabbed dock widgets.this->setTabShape(QTabWidget::Triangular);this->statusBar()->showMessage(tr("Status Bar"));addLog("框架启动完成,欢迎进入主界面!");QTimer::singleShot(2, this, SLOT(s_timeout()));
}void QDockWidgetDemo::initWorkSpaceView() {if (NULL == m_workspace) {m_workspace = new QWidget;m_workspace->setWindowTitle("工作区");this->setCentralWidget(m_workspace);}qDebug() << "工作区 id:" << m_workspace->winId() << ", name:" << m_workspace->windowTitle();
}void QDockWidgetDemo::initTitleBar()
{QMenuBar* m_MenuBar = this->menuBar();m_MenuBar->setStyleSheet(MenuBarStyle);QMenu* m_viewMenu = this->menuBar()->addMenu(tr("视图"));m_viewMenu->setStyleSheet(MenuStyle);m_toolBarAc = new QAction("工具栏");connect(m_toolBarAc, &QAction::triggered, this, &QDockWidgetDemo::s_showToolBar);m_toolBarAc->setCheckable(true);m_toolBarAc->setChecked(true);m_projectAc = new QAction("项目");connect(m_projectAc, &QAction::triggered, this, &QDockWidgetDemo::s_showPorjectWin);m_projectAc->setCheckable(true);m_projectAc->setChecked(true);m_propertyAc = new QAction("属性");connect(m_propertyAc, &QAction::triggered, this, &QDockWidgetDemo::s_showPropertyWin);m_propertyAc->setCheckable(true);m_propertyAc->setChecked(true);m_logAc = new QAction("输出");connect(m_logAc, &QAction::triggered, this, &QDockWidgetDemo::s_showLogWin);m_logAc->setCheckable(true);m_logAc->setChecked(true);m_viewMenu->addAction(m_toolBarAc);m_viewMenu->addAction(m_projectAc);m_viewMenu->addAction(m_propertyAc);m_viewMenu->addAction(m_logAc);QMenu* m_setView = this->menuBar()->addMenu(tr("编辑"));QMenu* m_toolMenu = this-> menuBar()->addMenu(tr("目标识别"));QMenu* m_sar = this->menuBar()->addMenu(tr("SAR处理"));QMenu* m_picture = this->menuBar()->addMenu(tr("图像"));QMenu* m_helpMenu = this->menuBar()->addMenu(tr("帮助"));//connect(m_setView, SIGNAL(triggered(QAction*)), this, SLOT(s_monitorFile(QAction*)));connect(m_setView, SIGNAL(triggered(QAction*)), this, SLOT(s_monitorFile(QAction*)));//connect(m_setView, &QMenu::triggered, this, &QDockWidgetDemo::s_monitorFile);initMaxMinWin();}void QDockWidgetDemo::initMaxMinWin() {m_maxminWin = new QWidget(this);QHBoxLayout* horizontalLayout;QSpacerItem* horizontalSpacer;horizontalLayout = new QHBoxLayout(m_maxminWin);horizontalLayout->setSpacing(0);horizontalLayout->setContentsMargins(11, 11, 11, 11);horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));horizontalLayout->setContentsMargins(0, 0, 0, 0);horizontalSpacer = new QSpacerItem(241, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);m_minBtn = new QPushButton(m_maxminWin);connect(m_minBtn, &QPushButton::clicked, this, &QDockWidgetDemo::s_min);m_minBtn->setObjectName(QString::fromUtf8("minBtn"));m_minBtn->setMinimumSize(QSize(40, 40));m_minBtn->setMaximumSize(QSize(40, 40));m_minBtn->setStyleSheet(QString::fromUtf8("QPushButton{border:none;}\n""QPushButton::hover{background-color:#E5E5E5;}\n"""));QIcon icon;icon.addFile(QString::fromUtf8(":/images/min_main.png"), QSize(), QIcon::Normal, QIcon::Off);m_minBtn->setIcon(icon);m_minBtn->setIconSize(QSize(25, 25));m_minBtn->setAutoDefault(false);m_minBtn->setFlat(false);m_minBtn->setDefault(false);m_closeBtn = new QPushButton(m_maxminWin);connect(m_closeBtn, &QPushButton::clicked, this, &QDockWidgetDemo::s_close);m_closeBtn->setObjectName(QString::fromUtf8("closeBtn"));m_closeBtn->setMinimumSize(QSize(40, 40));m_closeBtn->setMaximumSize(QSize(40, 40));m_closeBtn->setStyleSheet(QString::fromUtf8("QPushButton{border:none;}\n""QPushButton::hover{background-color:#E81123;}\n"));QIcon icon1;icon1.addFile(QString::fromUtf8(":/images/close_release.png"), QSize(), QIcon::Normal, QIcon::Off);m_closeBtn->setIcon(icon1);m_closeBtn->setIconSize(QSize(20, 20));m_closeBtn->setFlat(false);horizontalLayout->addItem(horizontalSpacer);horizontalLayout->addWidget(m_minBtn);horizontalLayout->addWidget(m_closeBtn);horizontalLayout->setStretch(0, 1);m_maxminWin->setLayout(horizontalLayout);this->menuBar()->setCornerWidget(m_maxminWin, Qt::TopRightCorner);
}void QDockWidgetDemo::initShowImage()
{m_ImageList = new QListWidget(m_workspace);m_ImageList->resize(2150, 1080);m_ImageList->setViewMode(QListWidget::IconMode);  //显示模式m_ImageList->setIconSize(QSize(400, 320));//设置图片大小m_ImageList->setSpacing(0);//间距//m_ImageList->setResizeMode(QListWidget::Adjust); //适应布局调整m_ImageList->setMovement(QListWidget::Free); //可移动,static:不可移动m_ImageList->setDragDropMode(QAbstractItemView::InternalMove);  //可拖拽m_ImageList->setWrapping(true);  //自动换行m_ImageList->setFlow(QListWidget::TopToBottom);  //从上到下   LeftToRight从左到右布局/*QGridLayout* grid = new QGridLayout;grid->addWidget(m_ImageList);this->setLayout(grid);*/m_ImageList->setHidden(true);}void QDockWidgetDemo::QDockWidgetDemo::s_showToolBar() {if (m_toolBarAc->isChecked()) {ui.mainToolBar->show();addLog("显示 工具栏");}else {ui.mainToolBar->hide();addLog("隐藏 工具栏");}
}void QDockWidgetDemo::QDockWidgetDemo::s_showPorjectWin() {if (m_projectAc->isChecked()) {m_projManagerView->show();addLog("显示 项目区");}else {m_projManagerView->hide();addLog("隐藏 项目区");}
}void QDockWidgetDemo::QDockWidgetDemo::s_showPropertyWin() {if (m_propertyAc->isChecked()) {m_propertyView->show();addLog("显示 属性区");}else {m_propertyView->hide();addLog("隐藏 属性区");}
}void QDockWidgetDemo::QDockWidgetDemo::s_showLogWin() {if (m_logAc->isChecked()) {m_logView->show();addLog("显示 日志区");}else {m_logView->hide();addLog("隐藏 日志区");}
}void QDockWidgetDemo::QDockWidgetDemo::s_timeout() {this->showMaximized();
}void QDockWidgetDemo::QDockWidgetDemo::s_close() {this->close();
}void QDockWidgetDemo::QDockWidgetDemo::s_min() {this->showMinimized();
}void QDockWidgetDemo::addLog(const QString& log)
{m_logBody->setReadOnly(true);m_logBody->append(log);
}void QDockWidgetDemo::s_monitorFile()
{qDebug() << tr("文件夹监控中");
}void QDockWidgetDemo::initLogView() {if (NULL == m_logView) {m_logView = new QDockWidget(this);//set dock widget feature: not move, enable close.m_logView->setFeatures(QDockWidget::DockWidgetClosable);m_logView->setWindowTitle("输出");m_logBody = new QTextEdit(this);m_logView->setWidget(m_logBody);}QPalette pl = m_logBody->palette();pl.setBrush(QPalette::Base, QBrush(QColor(255, 0, 0, 0)));m_logBody->setPalette(pl);
}void QDockWidgetDemo::initPropertyView() {if (NULL == m_propertyView) {m_propertyView = new QDockWidget(this);m_propertyView->setFeatures(QDockWidget::DockWidgetClosable);m_propertyView->setWindowTitle("飞行参数");m_propertyWin = new propertyWin(this);m_propertyView->setWidget(m_propertyWin);qDebug() << "属性区 id:" << m_propertyView->winId() << ", name:" << m_propertyView->windowTitle();}
}void QDockWidgetDemo::initProjectView() {if (NULL == m_projManagerView) {m_projManagerView = new QDockWidget(this);m_projManagerView->setFeatures(QDockWidget::DockWidgetClosable);m_projManagerView->setWindowTitle("图像列表");delete title bar//QWidget* lTitleBar = m_projManagerView->titleBarWidget();//QWidget* lEmptyWidget = new QWidget();//m_projManagerView->setTitleBarWidget(lEmptyWidget);//delete lTitleBar;m_projectWin = new projectWin(this);m_projManagerView->setWidget(m_projectWin);qDebug() << "项目区 id:" << m_projManagerView->winId() << ", name:" << m_projManagerView->windowTitle();connect(this, &QDockWidgetDemo::sigInitTree, m_projectWin, &projectWin::slotTree);connect(this, &QDockWidgetDemo::sigFilterJpg, this, &QDockWidgetDemo::slotShowImgs);}
}void QDockWidgetDemo::dockLayout() {this->addDockWidget(Qt::LeftDockWidgetArea, m_projManagerView, Qt::Orientation::Vertical);this->addDockWidget(Qt::RightDockWidgetArea, m_propertyView, Qt::Orientation::Vertical);this->addDockWidget(Qt::BottomDockWidgetArea, m_logView, Qt::Orientation::Vertical);
}void QDockWidgetDemo::initToolBar() {QSize toolIconSize(50, 30);ui.mainToolBar->setIconSize(toolIconSize);   //设置工具栏图标大小QIcon newFileIcon(":/images/新建文件.png");QIcon openFileIcon(":/images/打开文件.png");QIcon saveFileIcon(":/images/保存.png");QIcon runIcon(":/images/运行.png");QIcon stopIcon(":/images/停止.png");QIcon debugIcon(":/images/调试.png");QIcon anaysisIcon(":/images/分析.png");QIcon recordIcon(":/images/录制.png");QIcon grabIcon(":/images/抓取.png");QIcon capacityIcon(":/images/应用中心.png");QIcon paramterIcon(":/images/参数.png");QIcon publishIcon(":/images/发布.png");QIcon exportIcon(":/images/导出.png");m_newAc = new QAction(newFileIcon, "新建项目", this);m_saveAc = new QAction(saveFileIcon, "保存", this);m_runAc = new QAction(runIcon, "运行", this);m_stopAc = new QAction(stopIcon, "停止", this);m_debugAc = new QAction(debugIcon, "调试", this);m_anaysisAc = new QAction(anaysisIcon, "分析", this);m_recordAc = new QAction(recordIcon, "录制", this);m_grabAc = new QAction(grabIcon, "抓取", this);m_capacityAc = new QAction(capacityIcon, "能力中心", this);m_paramterAc = new QAction(paramterIcon, "参数", this);m_publishAc = new QAction(publishIcon, "发布", this);m_exportAc = new QAction(exportIcon, "导出", this);//add QAction to Widget.ui.mainToolBar->addAction(m_newAc);ui.mainToolBar->addAction(m_saveAc);ui.mainToolBar->addAction(m_saveAc);ui.mainToolBar->addSeparator();ui.mainToolBar->addAction(m_runAc);ui.mainToolBar->addAction(m_stopAc);ui.mainToolBar->addAction(m_debugAc);ui.mainToolBar->addAction(m_anaysisAc);ui.mainToolBar->addSeparator();ui.mainToolBar->addAction(m_recordAc);ui.mainToolBar->addAction(m_grabAc);ui.mainToolBar->addSeparator();ui.mainToolBar->addAction(m_capacityAc);ui.mainToolBar->addSeparator();ui.mainToolBar->addAction(m_paramterAc);ui.mainToolBar->addAction(m_publishAc);ui.mainToolBar->addAction(m_exportAc);ui.mainToolBar->addSeparator();connect(m_newAc, &QAction::triggered, this, &QDockWidgetDemo::s_MonitorFolder);connect(m_saveAc, &QAction::triggered, this, &QDockWidgetDemo::s_saveFile);connect(m_runAc, &QAction::triggered, this, &QDockWidgetDemo::s_runAc);connect(m_stopAc, &QAction::triggered, this, &QDockWidgetDemo::s_stopAc);connect(m_debugAc, &QAction::triggered, this, &QDockWidgetDemo::s_debugAc);connect(m_anaysisAc, &QAction::triggered, this, &QDockWidgetDemo::s_anaysisAc);connect(m_recordAc, &QAction::triggered, this, &QDockWidgetDemo::s_recordAc);connect(m_grabAc, &QAction::triggered, this, &QDockWidgetDemo::s_grabAc);connect(m_capacityAc, &QAction::triggered, this, &QDockWidgetDemo::s_capacityAc);connect(m_paramterAc, &QAction::triggered, this, &QDockWidgetDemo::s_paramterAc);connect(m_publishAc, &QAction::triggered, this, &QDockWidgetDemo::s_publishAc);connect(m_exportAc, &QAction::triggered, this, &QDockWidgetDemo::s_exportAc);
}void QDockWidgetDemo::QDockWidgetDemo::s_hideProj() {m_projectAc->setChecked(false);m_projManagerView->hide();
}void QDockWidgetDemo::QDockWidgetDemo::s_propertyWinHide(bool visible) {if (!visible) {m_propertyAc->setChecked(false);m_propertyView->hide();}
}void QDockWidgetDemo::QDockWidgetDemo::s_logWinHide(bool visible) {if (!visible) {m_logAc->setChecked(false);m_logView->hide();}
}void QDockWidgetDemo::s_MonitorFolder() {m_strMonitorDirectory = QFileDialog::getExistingDirectory(this, tr("请选择共享文件夹"), "./");QString monitorFolder = tr("开始监控文件夹:") + m_strMonitorDirectory;addLog(monitorFolder);m_allFile = getFolderFiles(m_strMonitorDirectory);m_filterJpgImg = fliterJPG(m_strMonitorDirectory);emit sigInitTree(m_allFile, m_strMonitorDirectory);emit sigFilterJpg(m_filterJpgImg, m_strMonitorDirectory);
}
void QDockWidgetDemo::s_saveFile() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_runAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_stopAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_debugAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_anaysisAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_recordAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_grabAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_capacityAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_paramterAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_publishAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}
void QDockWidgetDemo::s_exportAc() {QString log = QString("功能正在开发中,请耐心等待!");showMessageBox(log);addLog(log);
}void QDockWidgetDemo::showMessageBox(const QString& text) {if (NULL == m_msgBox) {m_msgBox = new MsgBox();}m_msgBox->setMsgText(text);m_msgBox->show();
}void QDockWidgetDemo::init()
{m_changeFiles.clear();m_strListFileNames.clear();QString filePath = "F:\\QtExercise\\FileMonitorMgr\\Test";m_strListFileNames = QDir(filePath).entryList();m_strMonitorDirectory = filePath;m_pDirectoryWatcher = new QFileSystemWatcher(this);m_pDirectoryWatcher->addPath(filePath);connect(m_pDirectoryWatcher, SIGNAL(directoryChanged(const QString&)), this, SLOT(slotDirectoryChanged(const QString&)));//connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(watchFloder(bool)));
}//QVector<QString> &MainWindow::getFileName()
//{
//    return m_fileNameVec;
//}void QDockWidgetDemo::slotDirectoryChanged(const QString& strDirectory)
{m_changeFiles.clear();QStringList strListFileNames; //To save new file namesQFileInfoList fileInfoList = QDir(m_strMonitorDirectory).entryInfoList();for (int n = 0; n < fileInfoList.size(); n++){QFileInfo fileInfo = fileInfoList[n];if (fileInfo.fileName().compare(".") == 0 || fileInfo.fileName().compare("..") == 0)continue;if (fileInfo.isDir())continue;QString strFileName = fileInfo.fileName();if (!m_strListFileNames.contains(strFileName)){strListFileNames << strFileName;//ui->textEdit->append(strFileName);m_changeFiles.push_back(strFileName);}}if (strListFileNames.isEmpty()){m_strListFileNames.clear();m_strListFileNames = GetFileNames(fileInfoList);return;}for (int n = 0; n < strListFileNames.size(); n++){//commit recon requestQString strFilePath = m_strMonitorDirectory + "/" + strListFileNames[n];emit sigCommitReconRequest(strFilePath);}m_strListFileNames.clear();m_strListFileNames = GetFileNames(fileInfoList);for (int i = 0; i < m_changeFiles.size(); i++)//显示变化的文件名//ui->textEdit->append(m_changeFiles.at(i));return;
}void QDockWidgetDemo::watchFloder(bool flag)
{QString filePath = QFileDialog::getExistingDirectory(this, QStringLiteral("请选择共享文件夹"), "./");//显示监视的文件路径//ui->lineEdit->setText(filePath);//    m_strListFileNames.clear();//    m_strListFileNames = QDir(filePath).entryList();//    m_strMonitorDirectory = filePath;//    m_pDirectoryWatcher = new QFileSystemWatcher( this );//    m_pDirectoryWatcher->addPath( filePath );//    connect( m_pDirectoryWatcher, SIGNAL( directoryChanged( const QString& ) ), this, SLOT( slotDirectoryChanged( const QString& ) ) );
}void QDockWidgetDemo::slotShowImgs(QStringList lst, QString path)
{QString allPath = path + "/";for (int i = 0; i < lst.size(); i++){QString onlyFile = lst.at(i);int pos = onlyFile.lastIndexOf("/");onlyFile = lst.at(i).right(lst.at(i).size() - pos - 1);QListWidgetItem* imageItem = new QListWidgetItem(/*m_ImageList*/);QString allImgFiles = allPath + lst.at(i);/*QPixmap pPhoto;pPhoto.loadFromData(QByteArray(), "jpg");QIcon ico;ico.addPixmap(pPhoto);*/imageItem->setIcon(QIcon(lst.at(i)));//imageItem->setText(onlyFile);imageItem->setSizeHint(QSize(190, 150));m_ImageList->addItem(imageItem);	//m_ImageList->setItemWidget(imageItem, this);}/*QGridLayout* grid = new QGridLayout;grid->addWidget(m_ImageList);this->setLayout(grid);*/m_ImageList->setHidden(false);
}QStringList QDockWidgetDemo::GetFileNames(const QFileInfoList& fileInfoList)
{QStringList strLstNames;int nFileNum = fileInfoList.size();for (int n = 0; n < nFileNum; n++){QFileInfo fileInfo = fileInfoList[n];strLstNames << fileInfo.fileName();}return strLstNames;
}QStringList QDockWidgetDemo::getFolderFiles(const QString& path)
{QDir dir(path);QStringList tempList;QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);foreach(QFileInfo fileInfo, fileList){if (fileInfo.isDir()){getFolderFiles(fileInfo.absoluteFilePath());}else{tempList.append(fileInfo.absoluteFilePath());}		}return tempList;
}QStringList QDockWidgetDemo::fliterJPG(const QString& path)
{QDir dir(path);QStringList tempList;QStringList filterJpgFiles;QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);foreach(QFileInfo fileInfo, fileList){if (fileInfo.isDir()){getFolderFiles(fileInfo.absoluteFilePath());}else{tempList.append(fileInfo.absoluteFilePath());}}foreach(QString item, tempList){if (item.contains(".jpg")){filterJpgFiles.append(item);}		}return filterJpgFiles;
}

2.左边图片目录展示界面

1.图片目录头文件

#pragma once#include <QWidget>
#include <QTreeWidget>
#include <QFileSystemWatcher>
#include <QListWidget>
#include "FileMonitorMgr.h"
#include "ui_projectWin.h"class QFileSystemWatcher;class projectWin : public QWidget
{Q_OBJECTpublic:projectWin(QWidget* parent = Q_NULLPTR);~projectWin();
public:FileMonitorMgr *m_fileMgr;void showImgList(QStringList& imgList);private:void initWidget();void initTree();public Q_SLOTS:void slotClicked(QTreeWidget* item, int column);void slotMenuPup(const QPoint* point);void slotTree(QStringList lst, QString path);//void slotShowImgs(QStringList lst, QString path);private:Ui::projectWin ui;QTreeWidget* m_tree;QMenu* m_menu;//QListWidget* m_ImageList;};

2.图片目录实现文件

#include "projectWin.h"#include <QStandardPaths>
#include <QDir>
#include <QDebug>
#include <QVBoxLayout>
#include <QGridLayout>#pragma execution_character_set("utf-8")const QString styles = "QTreeView\
{\background-color: #5B677A;\font-size:17px;\color: white;\
}\
QTreeView::item:hover\
{\background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);\border: 1px solid #bfcde4;\
}\
QTreeView::item:hover\
{\background: rgb(69, 187, 217);\
}\
QTreeView::item:selected:active\
{\background: rgb(255, 62, 150);\
}\
QTreeView::item:selected:!active\
{\background: rgb(63, 147, 168);\
}\
QTreeView::branch\
{\background:#5B677A;\
}\
QTreeView::branch:has-children:!has-siblings:closed,QTreeView::branch:closed:has-children:has-siblings\
{\border-image: none;\background:#5B677A;\image: url(image/Folder-1.png);\
}\
QTreeView::branch:open:has-children:!has-siblings,QTreeView::branch:open:has-children:has-siblings\
{\border-image: none;\background:#5B677A;\image: url(image/Open-Folder.png);\
}";projectWin::projectWin(QWidget* parent) : QWidget(parent)
{ui.setupUi(this);initWidget();
}projectWin::~projectWin() {}void projectWin::showImgList(QStringList& imgList)
{}void projectWin::initWidget() 
{//m_ImageList = new QListWidget;m_ImageList->setViewMode(QListWidget::IconMode);  //显示模式//m_ImageList->setIconSize(QSize(100, 100));//设置图片大小//m_ImageList->setSpacing(1);//间距//m_ImageList->setResizeMode(QListWidget::Adjust); //适应布局调整//m_ImageList->setMovement(QListWidget::Free); //可移动,static:不可移动//m_ImageList->setWrapping(true);  //自动换行//m_ImageList->setFlow(QListWidget::LeftToRight);  //从左到右布局}void projectWin::initTree()
{//m_fileMgr = new FileMonitorMgr("F:/QtExercise/QDockWidgetDemo/QDockWidgetDemo/Monitor");//m_tree = new QTreeWidget();打开右键菜单属性//m_tree->setContextMenuPolicy(Qt::CustomContextMenu);添加顶层节点//if (m_fileMgr->m_allFileList.size() > 0)//{//	int count = m_fileMgr->m_allFileList.size();//	for (int i = 0; i < count; i++)//	{//		QTreeWidgetItem* topItem = new QTreeWidgetItem(m_tree);//		topItem->setText(i, m_fileMgr->m_allFileList.at(i));//		topItem->setCheckState(i, Qt::Checked);//		m_tree->addTopLevelItem(topItem);//	}//}//m_tree->expandAll();//m_tree->setStyleSheet(styles);
}void projectWin::slotClicked(QTreeWidget* item, int column)
{}void projectWin::slotMenuPup(const QPoint* point)
{}void projectWin::slotTree(QStringList lst, QString path)
{//m_fileMgr = new FileMonitorMgr("F:/QtExercise/QDockWidgetDemo/QDockWidgetDemo/Monitor");m_tree = new QTreeWidget();//打开右键菜单属性m_tree->setContextMenuPolicy(Qt::CustomContextMenu);QTreeWidgetItem* topItem = new QTreeWidgetItem(m_tree);topItem->setText(0, path);topItem->setCheckState(0, Qt::Checked);m_tree->addTopLevelItem(topItem);int count = lst.size();//添加顶层节点if (lst.size() > 0){for (int i = 0; i < lst.size(); i++){int size = lst.at(i).size();int pos = lst.at(i).lastIndexOf("/");QString temp = lst.at(i).right(size - pos - 1);QTreeWidgetItem* item = new QTreeWidgetItem(topItem);item->setText(0, temp);item->setCheckState(0, Qt::Checked);}}QVBoxLayout* layout = new QVBoxLayout();m_tree->expandAll();m_tree->setStyleSheet(styles);layout->addWidget(m_tree);this->setLayout(layout);
}//void projectWin::slotShowImgs(QStringList lst, QString path)
//{
//	QString allPath = path + "/";
//	for (int i=0; i<lst.size(); i++)
//	{
//		QListWidgetItem* imageItem = new QListWidgetItem;
//		QString allImgFiles = allPath + lst.at(i);
//		imageItem->setIcon(QIcon(lst.at(i)));
//		imageItem->setText(lst.at(i));
//		imageItem->setSizeHint(QSize(120, 100));
//		m_ImageList->addItem(imageItem);
//	}	
//
//	QGridLayout* grid = new QGridLayout;
//	grid->addWidget(m_ImageList);
//	this->setLayout(grid);
//}

2.属性窗口区

1.属性窗口头文件

#pragma once#include <QWidget>#include "ui_propertyWin.h"class propertyWin : public QWidget
{Q_OBJECTpublic:propertyWin(QWidget* parent = Q_NULLPTR);~propertyWin();private:void initWidget();private:Ui::propertyWin ui;
};

2.属性窗口实现文件

#include "propertyWin.h"#include <QStandardPaths>
#include <QDir>
#include <QDebug>#pragma execution_character_set("utf-8")propertyWin::propertyWin(QWidget* parent) : QWidget(parent)
{ui.setupUi(this);initWidget();
}propertyWin::~propertyWin() {}void propertyWin::initWidget() {}

3 源码下载

源码下载地址

相关文章:

QT使用QListWidget显示多张图片

Qt系列文章目录 文章目录Qt系列文章目录前言一、QListWidget 和 QListView 的差异二、显示效果1.操作工作区界面1.主界面头文件2. 主界面实现界面2.左边图片目录展示界面1.图片目录头文件2.图片目录实现文件2.属性窗口区1.属性窗口头文件2.属性窗口实现文件3 源码下载前言 QLi…...

python 打印进度条

import time recv_size0 total_size1024while recv_size < total_size:time.sleep(0.1)recv_size1024#打印进度条percentrecv_size / total_sizeres int(50 * percent) * #print(\r[%-50s] %d%% % (res,int(100 * percent)),end) # end 打印以‘’结尾&#xff0c;打印% 需…...

【微小说】大学日记

感谢B站up主“看见晴晴了吗”的视频提供的灵感&#xff0c;链接&#xff1a;https://www.bilibili.com/video/BV1tA411m7Kc 整篇故事完全虚构&#xff0c;如有雷同纯属巧合。 2019年8月25日 星期天 晴 今天是我进入大学的第一天。早晨&#xff0c;我画了美美的妆&#xff0c;穿…...

ArrayList扩容机制解析

1.ArrayList的成员变量 首先我们先了解一下ArrayList的成员变量。 // 默认初始化大小 private static final int DEFAULT_CAPACITY 10;// 空数组&#xff08;用于空实例&#xff09; // 比如List<String> ls new ArrayList<>(0); private static final Object[…...

jsp-----web应用与开发

jsp基本语法 jsp页面的基本结构 定义变量 <%! %> 表达式&#xff1a;变量、常量、表达式 <% %>代码块、程序段【jsp程序代码即jsp脚本】 <% %>注释 隐藏注释 不会显示在客户的浏览器上&#xff0c;即jsp页面运行后页面上看不到注释内容。同时也不会出…...

洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

题目链接&#xff1a;P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 对于一群 n 个要互送礼物的朋友&#xff0c;GY 要确定每个人送出的钱比收到的多多少。在这一个问题中&#xff0c;每个人都准备了一些钱来送礼物…...

php设计模式-组合模式的运用

介绍 PHP的组合模式是一种设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构。该模式允许客户端统一处理单个对象和组合对象&#xff0c;使得客户端在处理对象时不需要知道对象是否为单个对象还是组合对象。 在组合模式中&#xff0c;有两种类型的…...

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中&#xff0c;少不了会进行不同服务之间的相互调用&#xff0c;比如A服务要调用B服务中的接口&#xff0c;如何简单方便的实现呢&#xff1f;fegin可以来帮助。 1、fegin的基本…...

OpenAI——CLIPs(代码使用示例)

OpenAI——CLIPs(打通NLP与CV) Open AI在2021年1月份发布Contrastive Language-Image Pre-training(CLIP),基于对比文本-图像对对比学习的多模态模型&#xff0c;通过图像和它对应的文本描述对比学习&#xff0c;模型能够学习到文本-图像对的匹配关系。它开源、多模态、zero-s…...

什么样的人更适合创业?那类人创业更容易成功?

创业是一项充满风险和机遇的事业&#xff0c;成功的创业者需要具备一定的素质和能力。那么&#xff0c;什么样的人更适合创业&#xff1f;哪类人创业更容易成功呢&#xff1f;本文将为您介绍几个适合创业的人群和成功创业者的共同特点。 具有创新精神的人 创业需要不断创新&am…...

JavaApi操作ElasticSearch(强烈推荐)

ElasticSearch 高级 1 javaApi操作es环境搭建 在elasticsearch官网中提供了各种语言的客户端&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/index.html 而Java的客户端就有两个&#xff1a; 不过Java API这个客户端&#xff08;Transport Client&#…...

NFT的前景,元宇宙的发展

互联网的普及和数字技术的广泛应用&#xff0c;成为消费升级的新动力&#xff0c;在不断创造出更好的数字化生活的同时&#xff0c;也改变了人们的消费习惯、消费内容、消费模式&#xff0c;甚至是消费理念&#xff0c;数字经济时代的文化消费呈现出新的特征。 2020年有关机构工…...

C#基础教程20 预处理器指令

文章目录 C#预处理指令教程简介预处理指令格式指令名 参数预处理指令类型条件编译指令if#if 条件表达式宏定义指令总结C#预处理指令教程 简介 预处理指令是在编译代码之前进行的一种处理,可以让程序员在编译前根据需要对代码进行一些修改、调整或者控制。C#语言中的预处理指令…...

【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;计数器与分频器 ​​ 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#…...

国外SEO策略指南:确保你的网站排名第一!

如果你想在谷歌等搜索引擎中获得更高的排名并吸引更多的流量和潜在客户&#xff0c;那么你需要了解一些国外SEO策略。 下面是一些可以帮助你提高谷歌排名的关键策略。 网站结构和内容优化 谷歌的搜索算法会考虑网站的结构和内容。 因此&#xff0c;你需要优化网站结构&…...

Tik Tok新手秘籍,做好五点可轻松起号

新手做TikTok需要有一个具体的规划布局&#xff0c;如果没有深思熟虑就上手开始的话&#xff0c;很有可能会导致功亏一篑&#xff0c;甚至是浪费时间。因此&#xff0c;想要做好 TikTok&#xff0c;就必须从最基本的运营细节开始&#xff0c;一步一步来&#xff0c;下面为大家分…...

【Linux】网络入门

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…...

回溯法——力扣题型全解【更新中】

&#xff08;本文源自网上教程的笔记&#xff09; 回溯基础理论 回溯搜索法&#xff0c;它是一种搜索的方式。 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 所以以下讲解中&#xff0c;回溯函数也就是递归函数&#xff0c;指的都是一个函数。 回溯法的效率 虽然…...

【华为机试真题详解 Python实现】分奖金【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…...

netlink进行网卡重命名

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if.h> #include <linux/netlink.h>#define MAX_PAYLOAD 1024 // 最大负载长…...

2023年春【数据分析与挖掘】文献精读(一)-1:针对COVID-19,使用聚类方法有效提取生物特性关联进而识别预防COVID-19的药物

分享给大家——动漫《画江湖之不良人》第四季片尾,主人公 李星云所说的一段话: 悠悠众生,因果循环,大道至简,世间若尽是不如意事, 越是执着,便越是苦,不如安下心来,看该看的风景,做好该做之事。 初行娆疆,所悟如此, 就像曾经有一位紫衣姑娘,第一次来中原时,一样…...

【Go自学第三节】Go的范围(Range)用法

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值&#xff0c;在集合中返回 key-value 对。 在讲Go语言的range之前&#xff0c;我们先回顾下Python中range的用法 for i …...

【备战面试】每日10道面试题打卡-Day6

本篇总结的是计算机网络知识相关的面试题&#xff0c;后续也会更新其他相关内容 文章目录1、HTTP 与 HTTPS 有哪些区别&#xff1f;2、HTTPS的加密过程是什么&#xff1f;3、GET与POST有什么区别&#xff1f;4、讲讲HTTP各个版本的区别&#xff1f;5、HTTP与FTP的区别&#xff…...

Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

一、说明 | 表示或者 表示 以上 二、模型 适用风景、房子、车子等漫画类风格 模型的VAE不要用模型附带的&#xff0c;好像就是naifu的官方vae&#xff0c;很老了&#xff0c;用 vae-ft-mse-840000-ema-pruned.ckpt 或者是 kl-f8-anime2.ckpt&#xff1b; 嵌入模型要下载作者…...

Salesforce 2023财年逆风增长,现金流达历史最高!

在过去的一年里&#xff0c;Salesforce一直是华尔街最关注的公司之一。3月1日&#xff0c;CRM领域的全球领导者Salesforce公布了截至2023年1月31日的第四季度和整个财年的业绩。 Salesforce主席兼首席执行官Marc Benioff表示&#xff1a; Salesforce全年实现了314亿美元的收入…...

2023年3月全国数据治理工程师认证DAMA-CDGA/CDGP考试怎么通过?

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…...

【安卓软件】KMPlayer-一款完美的媒体播放器 可以播放所有格式的字幕和视频

KM PlayerKM Player是一款未编码的视频播放器&#xff0c;让您无需编码即可方便地播放各种格式的视频&#xff0c;并为您的新体验添加了字幕支持、视频播放速度和手势等功能。KMPlayer 拥有美观和直观的设计&#xff0c;让您可以更方便地管理和播放视频&#xff01;功能高品质视…...

ClickHouse--分布式查询多副本的路由规则

前言在集群情况下&#xff0c;数据写入可以有写本地表和写分布式表2种方案&#xff0c;但是面向集群查询时&#xff0c;只能通过Distributed表引擎实现。本文主要介绍分布式查询多副本的路由规则。该配置项为&#xff1a;load_balancerandom/nearest_hostname/in_order/first_o…...

Linux 常用命令总结

本篇博客记录读研以来高频使用的 linux 系统下的命令合集 命令分类程序运行系统相关文件处理文件传输相关命令文件显示相关命令文件排列相关命令Anaconda 相关命令tmux 终端复用神器使用tips程序运行 自动保存日志&#xff0c;替代write命令&#xff1a; xxx | tee ./xxx.log…...

超分扩散模型 SR3 可以做图像去雨、去雾等恢复任务吗?

文章目录前言代码及原文链接主要的点如何进行图像恢复前言 关于扩散模型以及条件扩散模型的介绍&#xff0c;大家可以前往我的上一篇博客&#xff1a;扩散模型diffusion model用于图像恢复任务详细原理 (去雨&#xff0c;去雾等皆可)&#xff0c;附实现代码。 SR3是利用扩散模…...