Qt Widget中文示例 - 如何实现文档查看器?(一)

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

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

  • 使用QSettings查询和保存用户参数,并管理以前打开的文件历史记录。
  • 控制光标悬停在小部件上时的操作。
  • 创建动态加载的插件。
「Qt Widget中文示例指南」如何实现文档查看器?

创建一个应用程序和主窗口

应用程序及其主窗口是在main.cpp中构造的,main()函数使用QCommandLineParser来处理命令行参数——help、version和一个可选的位置参数file。如果用户在启动应用程序时提供了文件的路径,则主窗口将打开该文件:

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QCoreApplication::setOrganizationName("QtProject"_L1);
QCoreApplication::setApplicationName("DocumentViewer"_L1);
QCoreApplication::setApplicationVersion("1.0"_L1);

QCommandLineParser parser;
parser.setApplicationDescription(QApplication::translate("main",
"A viewer for JSON, PDF and text files"));
parser.addHelpOption();
parser.addVersionOption();
parser.addPositionalArgument("File"_L1, QApplication::translate("main",
"JSON, PDF or text file to open"));
parser.process(app);

const QStringList &positionalArguments = parser.positionalArguments();
const QString &fileName = (positionalArguments.count() > 0) ? positionalArguments.at(0)
: QString();

MainWindow w;
w.show();
if (!fileName.isEmpty())
w.openFile(fileName);

return app.exec();
}

MainWindow类

MainWindow类提供了一个带有菜单、操作和工具栏的应用程序屏幕,它可以打开一个文件,自动检测其内容类型。它还维护以前打开的文件列表,在启动时使用QSettings来存储和重新加载设置。MainWindow根据文件的内容类型为打开的文件创建一个合适的查看器,并提供打印文档的支持。

MainWindow的构造函数初始化Qt Designer中创建的用户界面,mainwindow.ui文件在左侧提供了一个QTabWidget,显示书签和缩略图,在右侧有一个QScrollArea,用于查看文件内容。

ViewerFactory类

ViewerFactory类管理已知文件类型的查看器,这些查看器是作为插件实现的。当ViewerFactory的实例被创建时,指向视图区域和主窗口的指针被传递给构造函数:

m_factory.reset(new ViewerFactory(ui->viewArea, this));

ViewerFactory在构建时加载所有可用的插件,它提供了一个公共API来查询加载的插件、它们的名称和支持的MIME类型:

using ViewerList = QList<AbstractViewer *>;
QStringList viewerNames(bool showDefault = false) const;
ViewerList viewers() const;
AbstractViewer *findViewer(const QString &viewerName) const;
AbstractViewer *defaultViewer() const;
QStringList supportedMimeTypes() const;

viewer()函数返回一个指向插件的指针,用于打开作为参数传递的QFile:

m_viewer = m_factory->viewer(file);

如果应用程序设置包含查看器的部分,则将其传递给查看器的虚拟restoreState()函数:

void MainWindow::restoreViewerSettings()
{
if (!m_viewer)
return;

QSettings settings;
settings.beginGroup(settingsViewers);
QByteArray viewerSettings = settings.value(m_viewer->viewerName(), QByteArray()).toByteArray();
settings.endGroup();
if (!viewerSettings.isEmpty())
m_viewer->restoreState(viewerSettings);
}

然后将标准UI资产传递给查看器,并设置主滚动区域来显示查看器的显示小部件:

m_viewer->initViewer(ui->actionBack, ui->actionForward, ui->menuHelp->menuAction(), ui->tabWidget);
restoreViewerSettings();
ui->scrollArea->setWidget(m_viewer->widget());
return true;
}

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 主题!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章