C++ Qt開發:MdiArea多窗體組件

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::SubWindowViewQMdiArea::TabbedView
setTabsClosable(bool closable) 設置子窗口標籤是否可關閉。
setTabsMovable(bool movable) 設置子窗口標籤是否可移動。
setTabShape(QTabWidget::TabShape shape) 設置子窗口標籤的形狀,例如QTabWidget::RoundedQTabWidget::Triangular
setDocumentMode(bool enabled) 設置是否以文檔模式顯示子窗口標籤。
setTabPosition(QTabWidget::TabPosition position) 設置子窗口標籤的位置,例如QTabWidget::NorthQTabWidget::South
setActivationOrder(QMdiArea::ActivationOrder order) 設置子窗口的激活順序,例如QMdiArea::StackingOrderQMdiArea::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類的構造函數和析構函數。

下面是一些關鍵點的概述:

  1. QMdiArea設置爲中央窗口:
    • this->setCentralWidget(ui->mdiArea);QMdiArea設置爲主窗口的中央窗口,表示主要的工作區域將由QMdiArea管理。
  2. 主窗口最大化顯示(註釋部分):
    • this->setWindowState(Qt::WindowMaximized); 這是一行註釋掉的代碼,表示將主窗口設置爲最大化顯示。你可以根據需要取消註釋,以便在啓動應用程序時窗口最大化。
  3. 工具欄設置:
    • ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 設置工具欄按鈕的顯示風格爲圖標下方顯示文本。這種設置在工具欄上同時顯示圖標和文本,提供了更直觀的用戶界面。
  4. 子窗口模式設置:
    • ui->mdiArea->setViewMode(QMdiArea::SubWindowView);QMdiArea的視圖模式設置爲子窗口模式。在子窗口模式下,QMdiArea管理並顯示各個子窗口,允許用戶同時查看和編輯多個文檔。
  5. 析構函數:
    • 析構函數中執行了 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): 子窗口以平鋪的方式顯示,使它們在主窗口中均勻分佈,方便用戶同時瀏覽多個子窗口內容。

這些模式提供了不同的用戶體驗,使用戶能夠根據實際需求選擇最適合他們工作流程的窗口排列方式。用戶可以根據應用程序的性質和自己的使用偏好在這些模式之間切換。

完整案例下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章