QMdiArea(Multiple Document Interface Area)是Qt中用於創建多文檔界面的組件。它提供了一種在單個視窗中管理多個文檔的方式,每個文檔通常是一個子視窗(`QMdiSubWindow`)。該組件主要用於設計多文檔界面應用程式,具備有多種窗體展示風格,實現了在父窗體中... ...
Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹MdiArea
組件的常用方法及靈活運用。
QMdiArea(Multiple Document Interface Area)是Qt中用於創建多文檔界面的組件。它提供了一種在單個視窗中管理多個文檔的方式,每個文檔通常是一個子視窗(QMdiSubWindow
)。該組件主要用於設計多文檔界面應用程式,具備有多種窗體展示風格,實現了在父窗體中內嵌多種子窗體的功能,使開發者能夠輕鬆地創建支持多個文檔的應用程式。
下麵是一些常用的QMdiArea
的方法,說明並概述成表格:
方法 | 說明 |
---|---|
QMdiArea(QWidget *parent = nullptr) |
構造函數,創建一個QMdiArea實例。 |
addSubWindow(QWidget *widget, Qt::WindowFlags flags = Qt::WindowFlags()) |
將指定的QWidget添加為QMdiArea的子視窗。 |
cascadeSubWindows() |
將所有子視窗進行層疊排列。 |
tileSubWindows() |
平鋪排列所有子視窗。 |
closeAllSubWindows() |
關閉所有子視窗。 |
setBackground(const QBrush &background) |
設置QMdiArea的背景色或背景圖片。 |
setViewMode(QMdiArea::ViewMode mode) |
設置子視窗排列模式,例如QMdiArea::SubWindowView 或QMdiArea::TabbedView 。 |
setTabsClosable(bool closable) |
設置子視窗標簽是否可關閉。 |
setTabsMovable(bool movable) |
設置子視窗標簽是否可移動。 |
setTabShape(QTabWidget::TabShape shape) |
設置子視窗標簽的形狀,例如QTabWidget::Rounded 或QTabWidget::Triangular 。 |
setDocumentMode(bool enabled) |
設置是否以文檔模式顯示子視窗標簽。 |
setTabPosition(QTabWidget::TabPosition position) |
設置子視窗標簽的位置,例如QTabWidget::North 或QTabWidget::South 。 |
setActivationOrder(QMdiArea::ActivationOrder order) |
設置子視窗的激活順序,例如QMdiArea::StackingOrder 或QMdiArea::CreationOrder 。 |
setTabbedView(bool tabbed) |
將QMdiArea設置為標簽視圖,即子視窗以標簽頁的形式顯示。 |
setOption(QMdiArea::AreaOption option, bool on = true) |
設置QMdiArea的選項,例如QMdiArea::DontMaximizeSubWindowOnActivation 。 |
activeSubWindow() |
返回當前激活的子視窗,如果沒有激活的子視窗則返回nullptr。 |
closeActiveSubWindow() |
關閉當前激活的子視窗。 |
這隻是一些常用方法的概述,實際上QMdiArea
提供了更多的方法和選項,以滿足不同應用場景的需求。開發者可以根據具體需求查閱官方文檔獲取更詳細的信息。
讀者在使用MDI
組件時,需要在UI
界面中增加mdiArea
控制項容器,之後所有窗體創建與操作都要在容器內進行,其次由於MDI
窗體組件僅僅是一個畫布只具備限制視窗的作用,無法實現生成窗體,所以需要在項目中手動增加自定義Dialog
對話框,並對該對話框進行一定的定製,首先繪製如下案例,其頂部是一個QToolBar
組件,底部則是一個QMidArea
組件,如下圖;
接著我們需要以此對上述菜單綁定一個唯一的名稱及文本,這個過程可以通過代碼實現,也可以通過圖形化配置,如下圖我們直接通過圖形化模式增加其功能;
1.1 初始化控制項
如下代碼,使用QMdiArea
創建多文檔界面的MainWindow
類的構造函數和析構函數。
下麵是一些關鍵點的概述:
QMdiArea
設置為中央視窗:this->setCentralWidget(ui->mdiArea);
將QMdiArea
設置為主視窗的中央視窗,表示主要的工作區域將由QMdiArea
管理。
- 主視窗最大化顯示(註釋部分):
this->setWindowState(Qt::WindowMaximized);
這是一行註釋掉的代碼,表示將主視窗設置為最大化顯示。你可以根據需要取消註釋,以便在啟動應用程式時視窗最大化。
- 工具欄設置:
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
設置工具欄按鈕的顯示風格為圖標下方顯示文本。這種設置在工具欄上同時顯示圖標和文本,提供了更直觀的用戶界面。
- 子視窗模式設置:
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
將QMdiArea
的視圖模式設置為子視窗模式。在子視窗模式下,QMdiArea
管理並顯示各個子視窗,允許用戶同時查看和編輯多個文檔。
- 析構函數:
- 析構函數中執行了
delete ui;
,確保在對象銷毀時釋放與ui
相關的資源,避免記憶體泄漏。
- 析構函數中執行了
這段代碼片段展示了一個使用QMdiArea
創建多文檔界面的主視窗類的基本結構和初始化設置。在這個視窗中,用戶可以打開和管理多個子視窗,每個子視窗可以包含一個獨立的文檔。
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setCentralWidget(ui->mdiArea);
// 視窗最大化顯示
// this->setWindowState(Qt::WindowMaximized);
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
// 子視窗模式
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
}
MainWindow::~MainWindow()
{
delete ui;
}
程式打開後可以看到如下圖所示的界面;
1.2 新建與關閉窗體
新建窗體時只需要調用new Dialog
創建新的窗體,並通過addSubWindow()
將新的窗體指針加入到組件內即可,當關閉時可以直接通過調用closeAllSubWindows()
來實現,如下代碼則是創建與關閉的實現。
// 新建窗體
void MainWindow::on_actionOpen_triggered()
{
// 創建Dialog窗體
Dialog *formDoc = new Dialog(this);
// 文檔視窗添加到MDI
ui->mdiArea->addSubWindow(formDoc);
// 在單獨的視窗中顯示
formDoc->show();
}
// 關閉全部
void MainWindow::on_actionClose_triggered()
{
// 關閉所有子視窗
ui->mdiArea->closeAllSubWindows();
}
運行後可以點擊打開窗體創建,這個創建是無限制的,如下圖;
1.3 轉換窗體模式
針對模式的轉換此處提供了三種模式,分別是MDI
模式、級聯
模式及平鋪
模式,三種模式的實現只需要調用不同的介面即可實現,代碼如下所示;
// 轉為MDI模式
void MainWindow::on_actionMID_triggered(bool checked)
{
// Tab多頁顯示模式
if (checked)
{
// Tab多頁顯示模式
ui->mdiArea->setViewMode(QMdiArea::TabbedView);
// 頁面可關閉
ui->mdiArea->setTabsClosable(true);
ui->actionLine->setEnabled(false);
ui->actionTile->setEnabled(false);
}
// 子視窗模式
else
{
// 子視窗模式
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
ui->actionLine->setEnabled(true);
ui->actionTile->setEnabled(true);
}
}
// 恢復預設模式
void MainWindow::on_actionWindow_triggered()
{
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);
ui->actionLine->setEnabled(true);
ui->actionMID->setEnabled(true);
ui->actionTile->setEnabled(true);
}
// 級聯模式
void MainWindow::on_actionLine_triggered()
{
ui->mdiArea->cascadeSubWindows();
}
// 平鋪模式
void MainWindow::on_actionTile_triggered()
{
ui->mdiArea->tileSubWindows();
}
子視窗模式(QMdiArea::SubWindowView)
- 這是多文檔界面的預設模式,允許用戶在主視窗內同時打開多個子視窗,每個子視窗可以包含一個獨立的文檔或視圖。
- 子視窗可以重疊、平鋪、級聯等方式排列。
標簽頁多頁顯示模式(QMdiArea::TabbedView)
- 在這種模式下,子視窗以標簽頁的形式顯示在主視窗的頂部,用戶可以通過點擊標簽頁來切換不同的子視窗。
- 提供了標簽頁的關閉按鈕,允許用戶關閉特定的標簽頁。
級聯模式和平鋪模式
- 這兩種模式是在標簽頁多頁顯示模式下的兩種特定排列方式。
- 級聯模式(Cascade): 子視窗以重疊的方式顯示,類似級聯排列的效果,方便用戶查看和操作每個子視窗。
- 平鋪模式(Tile): 子視窗以平鋪的方式顯示,使它們在主視窗中均勻分佈,方便用戶同時瀏覽多個子視窗內容。
這些模式提供了不同的用戶體驗,使用戶能夠根據實際需求選擇最適合他們工作流程的視窗排列方式。用戶可以根據應用程式的性質和自己的使用偏好在這些模式之間切換。
文章出處:https://www.cnblogs.com/LyShark/p/17909890.html本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!