C++ Qt开发:MdiArea多窗体组件
Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點介紹MdiArea`組件的常用方法及靈活運用。
QMdiArea(Multiple Document Interface Area)是Qt中用于創(chuàng)建多文檔界面的組件。它提供了一種在單個窗口中管理多個文檔的方式,每個文檔通常是一個子窗口(QMdiSubWindow)。該組件主要用于設計多文檔界面應用程序,具備有多種窗體展示風格,實現(xiàn)了在父窗體中內嵌多種子窗體的功能,使開發(fā)者能夠輕松地創(chuàng)建支持多個文檔的應用程序。
下面是一些常用的QMdiArea的方法,說明并概述成表格:
| 方法 | 說明 |
|---|---|
QMdiArea(QWidget *parent = nullptr) |
構造函數(shù),創(chuàng)建一個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提供了更多的方法和選項,以滿足不同應用場景的需求。開發(fā)者可以根據(jù)具體需求查閱官方文檔獲取更詳細的信息。
讀者在使用MDI組件時,需要在UI界面中增加mdiArea控件容器,之后所有窗體創(chuàng)建與操作都要在容器內進行,其次由于MDI窗體組件僅僅是一個畫布只具備限制窗口的作用,無法實現(xiàn)生成窗體,所以需要在項目中手動增加自定義Dialog對話框,并對該對話框進行一定的定制,首先繪制如下案例,其頂部是一個QToolBar組件,底部則是一個QMidArea組件,如下圖;
接著我們需要以此對上述菜單綁定一個唯一的名稱及文本,這個過程可以通過代碼實現(xiàn),也可以通過圖形化配置,如下圖我們直接通過圖形化模式增加其功能;
1.1 初始化控件
如下代碼,使用QMdiArea創(chuàng)建多文檔界面的MainWindow類的構造函數(shù)和析構函數(shù)。
下面是一些關鍵點的概述:
-
QMdiArea設置為*窗口:-
this->setCentralWidget(ui->mdiArea);將QMdiArea設置為主窗口的*窗口,表示主要的工作區(qū)域將由QMdiArea管理。
-
-
主窗口最大化顯示(注釋部分):
-
this->setWindowState(Qt::WindowMaximized);這是一行注釋掉的代碼,表示將主窗口設置為最大化顯示。你可以根據(jù)需要取消注釋,以便在啟動應用程序時窗口最大化。
-
-
工具欄設置:
-
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);設置工具欄按鈕的顯示風格為圖標下方顯示文本。這種設置在工具欄上同時顯示圖標和文本,提供了更直觀的用戶界面。
-
-
子窗口模式設置:
-
ui->mdiArea->setViewMode(QMdiArea::SubWindowView);將QMdiArea的視圖模式設置為子窗口模式。在子窗口模式下,QMdiArea管理并顯示各個子窗口,允許用戶同時查看和編輯多個文檔。
-
-
析構函數(shù):
- 析構函數(shù)中執(zhí)行了
delete ui;,確保在對象銷毀時釋放與ui相關的資源,避免內存泄漏。
- 析構函數(shù)中執(zhí)行了
這段代碼片段展示了一個使用QMdiArea創(chuàng)建多文檔界面的主窗口類的基本結構和初始化設置。在這個窗口中,用戶可以打開和管理多個子窗口,每個子窗口可以包含一個獨立的文檔。
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創(chuàng)建新的窗體,并通過addSubWindow()將新的窗體指針加入到組件內即可,當關閉時可以直接通過調用closeAllSubWindows()來實現(xiàn),如下代碼則是創(chuàng)建與關閉的實現(xiàn)。
// 新建窗體
void MainWindow::on_actionOpen_triggered()
{
// 創(chuàng)建Dialog窗體
Dialog *formDoc = new Dialog(this);
// 文檔窗口添加到MDI
ui->mdiArea->addSubWindow(formDoc);
// 在單獨的窗口中顯示
formDoc->show();
}
// 關閉全部
void MainWindow::on_actionClose_triggered()
{
// 關閉所有子窗口
ui->mdiArea->closeAllSubWindows();
}
運行后可以點擊打開窗體創(chuàng)建,這個創(chuàng)建是無限制的,如下圖;
1.3 轉換窗體模式
針對模式的轉換此處提供了三種模式,分別是MDI模式、級聯(lián)模式及平鋪模式,三種模式的實現(xiàn)只需要調用不同的接口即可實現(xiàn),代碼如下所示;
// 轉為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);
}
// 級聯(lián)模式
void MainWindow::on_actionLine_triggered()
{
ui->mdiArea->cascadeSubWindows();
}
// 平鋪模式
void MainWindow::on_actionTile_triggered()
{
ui->mdiArea->tileSubWindows();
}
子窗口模式(QMdiArea::SubWindowView)
- 這是多文檔界面的默認模式,允許用戶在主窗口內同時打開多個子窗口,每個子窗口可以包含一個獨立的文檔或視圖。
- 子窗口可以重疊、平鋪、級聯(lián)等方式排列。
標簽頁多頁顯示模式(QMdiArea::TabbedView)
- 在這種模式下,子窗口以標簽頁的形式顯示在主窗口的頂部,用戶可以通過點擊標簽頁來切換不同的子窗口。
- 提供了標簽頁的關閉按鈕,允許用戶關閉特定的標簽頁。
級聯(lián)模式和平鋪模式
- 這兩種模式是在標簽頁多頁顯示模式下的兩種特定排列方式。
- 級聯(lián)模式(Cascade): 子窗口以重疊的方式顯示,類似級聯(lián)排列的效果,方便用戶查看和操作每個子窗口。
- 平鋪模式(Tile): 子窗口以平鋪的方式顯示,使它們在主窗口中均勻分布,方便用戶同時瀏覽多個子窗口內容。
這些模式提供了不同的用戶體驗,使用戶能夠根據(jù)實際需求選擇最適合他們工作流程的窗口排列方式。用戶可以根據(jù)應用程序的性質和自己的使用偏好在這些模式之間切換。
完整案例下載
總結
以上是生活随笔為你收集整理的C++ Qt开发:MdiArea多窗体组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今晚20点 京东618预售狂欢开启:定
- 下一篇: java信息管理系统总结_java实现科