Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。
文档查看器是一个显示和打印JSON、文本和PDF文件的Widgets应用程序。Document Viewer(文档查看器)演示了如何使用带有静态和动态工具栏、菜单和操作的QMainWindow,此外它还演示了基于小部件的应用程序中的以下特性:
- 使用QSettings查询和保存用户参数,并管理以前打开的文件历史记录。
- 控制光标悬停在小部件上时的操作。
- 创建动态加载的插件。
点击获取Qt Widget组件下载(Q技术交流:166830288)
创建一个应用程序和主窗口
应用程序及其主窗口是在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 主题!