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