「Qt Widget中文示例指南」如何实现文档查看器?(三)

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

文档查看器是一个显示和打印JSON、文本和PDF文件的Widgets应用程序。Document Viewer(文档查看器)演示了如何使用带有静态和动态工具栏、菜单和操作的QMainWindow,此外它还演示了基于小部件的应用程序中的以下特性:

  • 使用QSettings查询和保存用户参数,并管理以前打开的文件历史记录。
  • 控制光标悬停在小部件上时的操作。
  • 创建动态加载的插件。

在上文中(点击这里回顾>>)主要介绍了创建一个应用程序和主窗口的一些类,本文将继续介绍一些其他类,请持续关注哦~

点击获取Qt Widget组件下载(Q技术交流:166830288)

创建一个应用程序和主窗口
其他相关类

HoverWatcher类

HoverWatcher类在将鼠标悬停在小部件上时设置覆盖光标,并在离开时恢复它。为了防止为同一个小部件创建多个HoverWatcher实例,它被实现为每个小部件单个实例。

HoverWatcher继承自QObject,并将它所监视的QWidget作为实例的父对象。它安装了一个事件过滤器来拦截悬停事件而不消耗它们:

cpp 复制代码
HoverWatcher::HoverWatcher(QWidget *watched)
: QObject(watched), m_watched(watched)
{
Q_ASSERT(watched);
m_cursorShapes[Entered].emplace(Qt::OpenHandCursor);
m_cursorShapes[MousePress].emplace(Qt::ClosedHandCursor);
m_cursorShapes[MouseRelease].emplace(Qt::OpenHandCursor);
// no default for Left => restore override cursor
m_watched->installEventFilter(this);
}

HoverAction枚举列出了HoverWatcher响应的动作:

enum HoverAction {
Entered,
MousePress,
MouseRelease,
Left,
Ignore
};

静态函数创建监视器,为特定的QWidget检查它们是否存在,或者解散监视器:

cpp 复制代码
static HoverWatcher *watcher(QWidget *watched);
static const HoverWatcher *watcher(const QWidget *watched);
static bool hasWatcher(QWidget *widget);
static void dismiss(QWidget *watched);

可以为每个HoverAction设置或取消光标形状,如果没有关联的游标形状,则在触发操作时恢复应用程序的覆盖游标。

cpp 复制代码
public slots:
void setCursorShape(HoverAction type, Qt::CursorShape shape);
void unSetCursorShape(HoverAction type);

mouseButtons属性保存了用于MousePress操作的鼠标按钮:

cpp 复制代码
void setMouseButtons(Qt::MouseButtons buttons);
void setMouseButton(Qt::MouseButton button, bool enable);

特定于动作的信号在处理一个动作后发出:

cpp 复制代码
signals:
void entered();
void mousePressed();
void mouseReleased();
void left();

发出一个通用信号,将处理后的动作作为参数传递:

cpp 复制代码
void hoverAction(HoverAction action);

RecentFiles类

RecentFiles是一个QStringList ,专门用于管理最近打开的文件列表。

RecentFiles有插槽添加单个文件或多个文件,如果路径指向存在且可以打开的文件,则将一个条目添加到最近的文件列表中。如果一个文件已经在列表中,它将从其原始位置移除并添加到顶部。

cpp 复制代码
public slots:
void addFile(const QString &fileName) { addFile(fileName, EmitPolicy::EmitWhenChanged); }
void addFiles(const QStringList &fileNames);

文件通过名称或索引从列表中删除:

cpp 复制代码
void removeFile(const QString &fileName) { removeFile(m_files.indexOf(fileName)); }
void removeFile(qsizetype index) {removeFile(index, RemoveReason::Other); }

插槽实现保存和恢复从QSettings:

cpp 复制代码
void saveSettings(QSettings &settings, const QString &key) const;
bool restoreFromSettings(QSettings &settings, const QString &key);

在恢复设置时,不存在的文件将被忽略。maxFiles属性保存要存储的最近文件的最大数量(默认为10)。

cpp 复制代码
qsizetype maxFiles();
void setMaxFiles(qsizetype maxFiles);

RecentFiles在接受一个文件之前验证它是否可以被读取。

RecentFileMenu类

RecentFileMenu是一个QMenu,专门用于将RecentFiles对象显示为子菜单。

它的构造函数接受一个指向父QObject的指针和一个指向RecentFiles对象的指针,该对象的内容将被可视化。它的fileOpened()信号,当用户从列表中选择一个最近的文件时触发,将绝对路径作为参数传递给该文件。

注意:RecentFileMenu要么被它的父部件销毁,要么被传递给它的构造函数的RecentFiles对象销毁。

cpp 复制代码
class RecentFileMenu : public QMenu
{
Q_OBJECT

public:
explicit RecentFileMenu(QWidget *parent, RecentFiles *recent);

signals:
void fileOpened(const QString &fileName);
...
};
Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!
相关推荐
坊钰28 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang133 分钟前
leetcode hot100 LRU缓存
java·开发语言
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
界面开发小八哥1 小时前
界面控件DevExpress v24.2新版亮点 - 支持.NET9、增强跨平台性
.net·界面控件·devexpress·ui开发·.net 9
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染1 小时前
Python 正则表达式
开发语言·python
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
小爬虫程序猿1 小时前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫
xlsw_1 小时前
java全栈day21--Web后端实战之利用Mybaits查询数据
java·开发语言
王老师青少年编程1 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛