Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。
文檔查看器是一個顯示和打印JSON、文本和PDF文件的Widgets應用程序。Document Viewer(文檔查看器)演示瞭如何使用帶有靜態和動態工具欄、菜單和操作的QMainWindow,此外它還演示了基於小部件的應用程序中的以下特性:
- 使用QSettings查詢和保存用戶參數,並管理以前打開的文件歷史記錄。
- 控制光標懸停在小部件上時的操作。
- 創建動態加載的插件。
創建一個應用程序和主窗口
應用程序及其主窗口是在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 主題!