GithubImageHost图床本地缓存设计

2023-11-06

GithubImageHost图床本地缓存设计

项目介绍:一个简易的Github图床客户端

项目仓库:GithubImageHost


试过很多图床,都缺少全部图片预览的功能(按照目录,预览仓库内所有图片),只有预览通过该图床上传过的图片。
想了下自己想要的:默认只预览本地上传和下载的图片,当点击更新仓库按钮后则同步仓库内所有图片到本地缓存并支持预览。
实现:把图片利用Qt的scaled调整到200, 150的尺寸,每次更新过后保存到本地文件。

利用QDataStream实现自定义结构体的写入写出:

struct GHImage
{
    QString html_url { "" };
    QString download_url { "" };
    QString name { "" };
    QString github_path { "" };
    QString sha { "" };
    QImage pix;

    friend QDataStream &operator<<(QDataStream &out, const GHImage &info)
    {
        return out << info.html_url << info.download_url << info.name << info.github_path << info.sha << info.pix;
    }

    friend QDataStream &operator>>(QDataStream &in, GHImage &info)
    {
        return in >> info.html_url >> info.download_url >> info.name >> info.github_path >> info.sha >> info.pix;
    }

    inline bool operator==(const GHImage &info)
    {
        return sha == info.sha && github_path == info.github_path;
    }
};

struct GithubInfo
{
    QString gh_token;
    QString user_name;
    QString repo_name;

    friend QDataStream &operator<<(QDataStream &out, const GithubInfo &info)
    {
        return out << info.gh_token << info.user_name << info.repo_name;
    }

    friend QDataStream &operator>>(QDataStream &in, GithubInfo &info)
    {
        return in >> info.gh_token >> info.user_name >> info.repo_name;
    }

    friend QDebug &operator<<(QDebug out, const GithubInfo &info)
    {
        out << info.gh_token << info.user_name << info.repo_name;
        return out;
    }

    inline bool operator==(const GithubInfo &info)
    {
        return gh_token == info.gh_token && user_name == info.user_name && repo_name == info.repo_name;
    }

    inline bool isEmpty() const
    {
        return gh_token.isEmpty() || user_name.isEmpty() || repo_name.isEmpty();
    }
};


using GHImageMap = QMap<QString, QList<GHImage>>;
static GHImageMap images_;
static QSize img_size_;
static GithubInfo info_;

GithubInfo GitHubImageHost::info_;
QSize GitHubImageHost::img_size_(200, 150);
GitHubImageHost::GHImageMap GitHubImageHost::images_;

void GitHubImageHost::WriteImages()
{

    QFile file(image_map_cfg_);
    if (file.open(QIODevice::WriteOnly)) {
        QDataStream out(&file);
        out << info_;
        out << int(images_.size());
        foreach (auto key, images_.keys()) {
            auto &list = images_.value(key);
            out << key << int(list.size());
            foreach (auto var, list) {
                out << var;
            }
        }
        file.close();
    }
}

void GitHubImageHost::ReadImages()
{
    images_.clear();
    QFile file(image_map_cfg_);
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);

        GithubInfo info;
        in >> info;
        if (info == info_) {
            int path_size;
            in >> path_size;
            while (path_size > 0) {
                path_size--;
                QString path;
                QList<GHImage> img_list;
                int img_size;
                in >> path >> img_size;
                while (img_size > 0) {
                    img_size--;
                    QString path;
                    GHImage img;
                    in >> img;
                    img_list << img;
                }
                images_[path] = img_list;
            }

        } else {
            qDebug() << u8"githubinfo.cfg 校验失败";
        }

        file.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GithubImageHost图床本地缓存设计 的相关文章

  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • QObject 通用信号处理程序

    信号处理程序 是指插槽 而不是 POSIX 信号的处理程序 我需要 连接 可能不会 using QObject connect直接地 所有信号从 QObject 的 未知 子类的实例到一个单槽另一个 QObject 的 我需要这个才能通过网
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • QByteArray 到整数

    正如您可能从标题中看出的那样 我在转换QByteArray为一个整数 QByteArray buffer server gt read 8192 QByteArray q size buffer mid 0 2 int size q siz
  • 相对文件路径的区别:Qt Creator的调试模式和发布模式

    QFile file test txt if file open QIODevice ReadOnly qDebug lt lt You got me 我在用 Qt 4 8 6 与 MSVC 2010 Qt 创建者 3 1 1 Window
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本

随机推荐