Qt XDF阅读管理
XDF是道客巴巴文件下载的文档格式,类似PDF。文档使用过程中,需要对不同文档进行分类以方便阅读,Qt XDF阅读管理提供文档阅读、分类和文件名查找,文本文件存储相关数据。
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QDir>
#include <QListWidget>
#include <QListWidgetItem>
#include <QDesktopServices>
#include <QUrl>
#include <QTextStream>
#include <QMenu>
#include <QAction>
#include <QCollator>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QFont font;font.setPixelSize(26);setFont(font);setWindowTitle(QStringLiteral("XDF阅读管理"));mDirPath = QStringLiteral("D:\\123");ui->comboBox_type->setSizeAdjustPolicy(QComboBox::AdjustToContents);connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(readXDF(QModelIndex)));ui->listWidget->setSelectionBehavior(QAbstractItemView::SelectItems);ui->listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->listWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(listWidgetMenu(QPoint)));getTypes();getDetails();QTimer::singleShot(0, this, SLOT(readFiles()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::closeEvent(QCloseEvent *event)
{Q_UNUSED(event);
}void MainWindow::readFiles()
{QDir dir(mDirPath);if (!dir.exists()){return;}dir.setFilter(QDir::Files);dir.setSorting(QDir::Name);QFileInfoList fileInfoLst = dir.entryInfoList();if (fileInfoLst.isEmpty()){return;}mNameLst.clear();mFileMap.clear();foreach (QFileInfo fileInfo, fileInfoLst){if ((fileInfo.suffix().toLower() == "xdf") || (fileInfo.suffix().toLower() == "pdf")){QString name = fileInfo.fileName();QString path = fileInfo.absoluteFilePath();mNameLst.append(name);mFileMap.insert(name, path);}}QLocale cn(QLocale::Chinese);QCollator collator(cn);std::sort(mNameLst.begin(), mNameLst.end(), collator);foreach (QString name, mNameLst){addListWidgetItem(name, mFileMap.value(name));}updateLabel();
}void MainWindow::readXDF(const QModelIndex &index)
{Q_UNUSED(index);QString file = ui->listWidget->currentItem()->data(Qt::UserRole).toString();QDesktopServices::openUrl(QUrl::fromLocalFile(file));
}void MainWindow::getTypes()
{ui->comboBox_type->addItem(QStringLiteral("无"));QStringList dataLst = openReadFile("xdf_types.txt");foreach (QString data, dataLst){if (!data.isEmpty()){ui->comboBox_type->addItem(data);}}
}void MainWindow::getDetails()
{QStringList tmpLst;QStringList dataLst = openReadFile("xdf_details.txt");foreach (QString data, dataLst){if (!data.isEmpty()){if (!tmpLst.contains(data)){tmpLst.append(data);}}}mDetailMap.clear();dataLst = tmpLst;foreach (QString data, dataLst){if (!data.isEmpty()){QStringList lst = data.split(":");if (!mDetailMap.contains(lst[0])){QStringList valueLst;valueLst.append(lst[1]);mDetailMap.insert(lst[0], valueLst);}else{QStringList valueLst = mDetailMap.value(lst[0]);valueLst.append(lst[1]);mDetailMap.insert(lst[0], valueLst);}}}
}void MainWindow::updateLabel()
{ui->label->setText(QStringLiteral("%1个文件").arg(ui->listWidget->count()));
}void MainWindow::on_pushButton_search_clicked()
{QString keyword = ui->lineEdit_keyword->text();if (keyword.isEmpty() || keyword.trimmed().isEmpty()){return;}QStringList retLst;foreach (QString name, mFileMap.keys()){if (name.contains(keyword)){retLst.append(QStringLiteral("%1*%2").arg(name).arg(mFileMap.value(name)));}}if (retLst.isEmpty()){return;}ui->listWidget->clear();foreach (QString ret, retLst){addListWidgetItem(ret.split("*")[0], ret.split("*")[1]);}updateLabel();
}void MainWindow::on_pushButton_type_add_clicked()
{if (ui->comboBox_type->currentText() == QStringLiteral("无")){return;}if (ui->listWidget->currentItem()){QFile file(QStringLiteral("xdf_details.txt"));if (!file.open(QIODevice::Append | QIODevice::Text)){return;}QListWidgetItem *item = ui->listWidget->currentItem();QTextStream out(&file);out.setCodec("UTF-8");out << QStringLiteral("%1:%2\n").arg(ui->comboBox_type->currentText()).arg(item->text());file.close();getDetails();}
}void MainWindow::listWidgetMenu(QPoint point)
{QListWidgetItem *item = ui->listWidget->itemAt(point);if (item == nullptr){return;}QMenu *menu = new QMenu(this);QAction *addType = new QAction(QStringLiteral("添加分类"), this);menu->addAction(addType);connect(addType, SIGNAL(triggered(bool)), this, SLOT(addMultiType()));menu->exec(QCursor::pos());delete addType;delete menu;
}void MainWindow::addMultiType()
{if (ui->comboBox_type->currentText() == QStringLiteral("无")){return;}QStringList dataLst;QList<QListWidgetItem*> itemLst = ui->listWidget->selectedItems();foreach (QListWidgetItem *item, itemLst){dataLst.append(QStringLiteral("%1:%2\n").arg(ui->comboBox_type->currentText()).arg(item->text()));}QFile file(QStringLiteral("xdf_details.txt"));if (!file.open(QIODevice::Append | QIODevice::Text)){return;}QTextStream out(&file);out.setCodec("UTF-8");foreach (QString data, dataLst){out << data;}file.close();getDetails();
}QStringList MainWindow::openReadFile(QString fileName)
{QStringList dataLst;QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){return dataLst;}QTextStream in(&file);in.setCodec("UTF-8");dataLst = in.readAll().split("\n");return dataLst;
}void MainWindow::addListWidgetItem(QString name, QString path)
{QListWidgetItem *item = new QListWidgetItem;item->setText(name);item->setData(Qt::UserRole, path);ui->listWidget->addItem(item);
}void MainWindow::on_pushButton_type_search_clicked()
{if (ui->comboBox_type->currentText() == QStringLiteral("无")){ui->listWidget->clear();foreach (QString name, mNameLst){addListWidgetItem(name, mFileMap.value(name));}updateLabel();return;}QStringList nameLst = mDetailMap.value(ui->comboBox_type->currentText(), QStringList());if (nameLst.isEmpty()){return;}QLocale cn(QLocale::Chinese);QCollator collator(cn);std::sort(nameLst.begin(), nameLst.end(), collator);ui->listWidget->clear();foreach (QString name, nameLst){addListWidgetItem(name, mFileMap.value(name));}updateLabel();
}
Qt XDF阅读管理相关推荐
- 使用QT进行内存管理
使用QT进行内存管理 Memory Management with Qt 使用QT进行内存管理 Garbage Collection through the Back Door 通过后门垃圾回收 Hi ...
- Qt Linguist 发行管理Release Manager
Qt Linguist 发行管理Release Manager 发行管理Release Manager 创建翻译文件 使用lupdate 使用lrelease 缺少翻译 发行管理Release Man ...
- CIO Mini MBA 阅读管理书籍
CIO Mini MBA 阅读管理书籍 陈东锋推荐,2012-5-28 企业战略.目标管理.管理体系 <平衡记分卡--化战略为行动>罗伯特.卡普兰等,广东经济出版社,2004. <目 ...
- Calibre for Mac v5.29.0电子书阅读管理工具
Calibre Mac版是 macOS 系统上一款简单实用的电子书阅读管理工具,比普通的电子书软件相比,性能有了更高的提升,可以进行电子书的格式转换.阅读等,把你的电子书图书馆进行图书管理. 应用介绍 ...
- Calibre for Mac v5.20.0 中文版 电子书阅读管理工具
Calibre Mac版是 macOS 系统上一款简单实用的电子书阅读管理工具,比普通的电子书软件相比,性能有了更高的提升,可以进行电子书的格式转换.阅读等,把你的电子书图书馆进行图书管理. 应用介绍 ...
- 入手查找阅读管理文献 | 来自科研小白的总结
入手查找&阅读&管理文献 | 来自科研小白的总结 如何入手查找&阅读&管理文献 [查找了一些如何阅读文献的大牛经验分享] [文献分类1] [文献分类2] [数据库资源] ...
- Qt物联网综合管理平台源码
Qt物联网综合管理平台源码 0.2.1 软件模块 设备监控模块,包括数据监控(表格形式展示).设备面板(面板形式展示).地图监控(地图形式展示).曲线监控(曲线形式展示). 数据查询模块,包括报警记录 ...
- (附源码)计算机毕业设计SSM专业书目推荐阅读管理
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
- QT 常用布局管理器
Qt布局管理详解 详解 QT 布局管理界面 图文并茂 QT主要布局管理器分类 QHBoxLayout(水平布局) 把子窗口从左到右排列在一个水平行上. QWidget *window = new QW ...
- Qt之布局管理——堆栈窗体
QStackedWidget类继承于QFrame类,用于堆栈窗体的管理. Public Slots: void setCurrentIndex( int index ) inde ...
最新文章
- Python超越Java,Rust持续称王!Stack Overflow 2019开发者报告
- 非常强悍的 RabbitMQ 总结,写得真好
- 十四、JavaScript表单中的验证API
- iBatis.Net系列(一)-简介
- 用户空间使用内核头文件
- 网页中插入javascript的几种方法
- 在Linux和Mac OS X系统上运行.NET
- jave类命名_Java重命名文件– Jave移动文件
- leetcode(105)从前序遍历和中序遍历构建二叉树
- Mac m1 max 工具安装及简介
- 浏览器默认打开360搜索怎么办?
- 新型脑机接口实现无线通信
- 未来教育计算机二级office评分有问题,未来教育计算机二级-未来教育计算机二级msoffice题库评分 – 手机爱问...
- 数据结构实训——统计成绩
- antd源码解读 之 构建工具antd-tools
- Docker 配置阿里云加速
- 艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?
- 【Java知识点总结】Java 变量
- Unity中的Object和object的区别
- 体育计算机培训心得体会,关于体育培训学习心得体会5篇