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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在手机上打开xdf格式文件,您可以按照以下步骤进行操作: 1. 首先,在应用商店中搜索并下载一个可以支持xdf格式的文件查看器或编辑器应用。常见的应用包括Adobe Acrobat Reader、Microsoft Office等。 2. 安装完成后,打开所下载的应用。 3. 在应用的主界面中,通常会提供"打开"或"选择文件"的选项。点击该选项。 4. 接下来,浏览您的手机存储或SD卡中的文件夹,找到保存有xdf格式文件的位置。点击该文件进行选择。 5. 应用将会加载并打开xdf格式文件。 6. 一旦文件被打开,您可以通过滑动、放大缩小等手势操作来查看xdf文件的内容。 请注意,需确保您选择的应用是能够兼容xdf格式的。如果您无法找到适合的应用或选择的应用无法打开xdf文件,尝试在搜索引擎上进一步查找其他解决方案。 ### 回答2: 要在手机上打开xdf格式文件,您需要将文件从电脑或其他设备传输到手机上,并安装一个与xdf格式兼容的应用程序。 首先,将xdf格式文件从电脑或其他设备传输到手机上。您可以通过数据线将手机连接到电脑上,并将文件复制到手机的存储空间中。另外,您也可以通过电子邮件、云存储服务或其他文件传输应用程序将文件发送到手机上。 接下来,您需要安装一个与xdf格式兼容的应用程序。您可以在应用商店中搜索并下载与xdf格式兼容的文件查看器或编辑器应用程序。在应用商店中搜索xdf文件阅读器或xdf文件编辑器,然后选择一个评价好且符合您需求的应用程序进行安装。 安装完成后,打开应用程序并浏览到您存储文件的位置。在应用程序中使用文件管理器或浏览器功能,浏览到您的xdf格式文件所在的文件夹。然后,选择要打开的xdf文件。 应用程序将打开并加载xdf文件。您可以查看、编辑、保存、共享或以其他方式处理该文件,具体取决于您选择的应用程序功能。 请注意,您需要确保选择的应用程序与xdf文件格式兼容,并在手机上具有足够的处理能力来打开和处理文件。 ### 回答3: xdf格式文件是一种扩展数据格式,通常用于存储各种类型的数据,如电子表格、图表、图像等。要在手机上打开xdf格式文件,您可以按照以下步骤进行操作。 首先,确保您的手机上安装了一个支持xdf格式文件的应用程序。您可以在应用商店搜索并下载适合您的手机型号和操作系统的应用。一些常见的应用程序,如Microsoft Office、Adobe Acrobat等,通常都可以打开xdf格式文件。 安装完应用程序后,打开该应用程序并导航到文件浏览器或文档管理器。从中选择xdf格式文件所在的文件夹或位置。 在文件浏览器中找到您想要打开的xdf格式文件,并单击它来打开。如果您的应用程序支持直接在文件浏览器中打开文件,可能还会出现“打开”按钮。 应用程序打开xdf格式文件后,您可以查看、编辑或执行其他相应操作。具体操作取决于您选择的应用程序以及xdf文件中包含的内容。您可以使用应用程序提供的工具和功能,如查看电子表格、编辑文本、查看图像等。 请注意,某些xdf格式文件可能需要特定的应用程序才能正确打开和处理。如果您无法打开某个xdf格式文件,请尝试使用其他应用程序或将文件转换为另一种通用格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值