「Qt Widget中文示例指南」如何實現文檔查看器?(三)

Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。

文檔查看器是一個顯示和打印JSON、文本和PDF文件的Widgets應用程序。Document Viewer(文檔查看器)演示瞭如何使用帶有靜態和動態工具欄、菜單和操作的QMainWindow,此外它還演示了基於小部件的應用程序中的以下特性:

  • 使用QSettings查詢和保存用戶參數,並管理以前打開的文件歷史記錄。
  • 控制光標懸停在小部件上時的操作。
  • 創建動態加載的插件。

在上文中(點擊這裏回顧>>)主要介紹了創建一個應用程序和主窗口的一些類,本文將繼續介紹一些其他類,請持續關注哦~

「Qt Widget中文示例指南」如何實現文檔查看器?

創建一個應用程序和主窗口

其他相關類

HoverWatcher類

HoverWatcher類在將鼠標懸停在小部件上時設置覆蓋光標,並在離開時恢復它。爲了防止爲同一個小部件創建多個HoverWatcher實例,它被實現爲每個小部件單個實例。

HoverWatcher繼承自QObject,並將它所監視的QWidget作爲實例的父對象。它安裝了一個事件過濾器來攔截懸停事件而不消耗它們:

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檢查它們是否存在,或者解散監視器:

static HoverWatcher *watcher(QWidget *watched);
static const HoverWatcher *watcher(const QWidget *watched);
static bool hasWatcher(QWidget *widget);
static void dismiss(QWidget *watched);

可以爲每個HoverAction設置或取消光標形狀,如果沒有關聯的遊標形狀,則在觸發操作時恢復應用程序的覆蓋遊標。

public slots:
void setCursorShape(HoverAction type, Qt::CursorShape shape);
void unSetCursorShape(HoverAction type);

mouseButtons屬性保存了用於MousePress操作的鼠標按鈕:

void setMouseButtons(Qt::MouseButtons buttons);
void setMouseButton(Qt::MouseButton button, bool enable);

特定於動作的信號在處理一個動作後發出:

signals:
void entered();
void mousePressed();
void mouseReleased();
void left();

發出一個通用信號,將處理後的動作作爲參數傳遞:

void hoverAction(HoverAction action);

RecentFiles類

RecentFiles是一個QStringList ,專門用於管理最近打開的文件列表。

RecentFiles有插槽添加單個文件或多個文件,如果路徑指向存在且可以打開的文件,則將一個條目添加到最近的文件列表中。如果一個文件已經在列表中,它將從其原始位置移除並添加到頂部。

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

文件通過名稱或索引從列表中刪除:

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

插槽實現保存和恢復從QSettings:

void saveSettings(QSettings &settings, const QString &key) const;
bool restoreFromSettings(QSettings &settings, const QString &key);

在恢復設置時,不存在的文件將被忽略。maxFiles屬性保存要存儲的最近文件的最大數量(默認爲10)。

qsizetype maxFiles();
void setMaxFiles(qsizetype maxFiles);

RecentFiles在接受一個文件之前驗證它是否可以被讀取。

RecentFileMenu類

RecentFileMenu是一個QMenu,專門用於將RecentFiles對象顯示爲子菜單。

它的構造函數接受一個指向父QObject的指針和一個指向RecentFiles對象的指針,該對象的內容將被可視化。它的fileOpened()信號,當用戶從列表中選擇一個最近的文件時觸發,將絕對路徑作爲參數傳遞給該文件。

注意:RecentFileMenu要麼被它的父部件銷燬,要麼被傳遞給它的構造函數的RecentFiles對象銷燬。

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