《四》系統模塊整體功能關聯與實現

在上一篇里,我們完成了動作的創建,那么這一次,我們把它加載到界面上,把需要是實現的動作都加上。

MyWord::MyWord(QWidget *parent): QMainWindow(parent)
{mdiArea=new QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setCentralWidget(mdiArea);connect(mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(updateMenus()));windowMapper=new  QSignalMapper(this);//映射器重新發送信號,根據信號設置活動窗口connect(windowMapper,SIGNAL(mapped(QWidget*)),this,SLOT(setActiveSubWindow(QWidget*)));//創建菜單、工具欄、狀態欄等相關操作(動作集合)createActions();createMenus();//調用創建菜單實現createToolBars();//調用創建工具條updateMenus();//更新菜單條目resize(800,600);setWindowTitle(tr("Office辦公自動化文字編輯 軟件 V2.1"));setUnifiedTitleAndToolBarOnMac(true);
}

上一次我們玩還曾了create Actions(),接下來,我們要完成createMenus(),createToolBars()等功能。

void MyWord::createMenus()
{//文件菜單fileMenu=menuBar()->addMenu(tr("文件(&F)"));fileMenu->addAction(newAct);fileMenu->addAction(openAct);fileMenu->addSeparator();//添加分隔符fileMenu->addAction(saveAct);fileMenu->addAction(saveAsAct);fileMenu->addSeparator();fileMenu->addAction(printAct);fileMenu->addAction(printPreviewAct);fileMenu->addSeparator();fileMenu->addAction(exitAct);
}

創建菜單,通過menuBar()的addMenu函數添加,再往里面添加動作,順便還添加了分隔符addSeparator()

其他也一樣添加進去就好了

//編輯菜單editMenu=menuBar()->addMenu(tr("編輯(&E)"));editMenu->addAction(undoAct);editMenu->addAction(redoAct);editMenu->addSeparator();editMenu->addAction(cutAct);editMenu->addAction(copyAct);editMenu->addAction(pasteAct);//格式菜單formatMenu=menuBar()->addMenu(tr("格式(&O)"));fontMenu=formatMenu->addMenu(tr("字體(&D)"));//字體子菜單fontMenu->addAction(boldAct);fontMenu->addAction(italicAct);fontMenu->addAction(underlineAct);alignMenu=formatMenu->addMenu(tr("段落"));alignMenu->addAction(leftAlignAct);alignMenu->addAction(centerAct);alignMenu->addAction(rightAlignAct);alignMenu->addAction(justifyAct);formatMenu->addAction(colorAct);//窗口windowMenu=menuBar()->addMenu(tr("窗口(&W)"));updateWindowMenu();connect(windowMenu,SIGNAL(aboutToShow()),this,SLOT(updateWindowMenu()));menuBar()->addSeparator();//幫助菜單helpMenu=menuBar()->addMenu(tr("幫助(&H)"));helpMenu->addAction(aboutAct);helpMenu->addSeparator();helpMenu->addAction(aboutQtAct);

?

在窗口這個動作里,我們鏈接函數就好了

Qmenu類下有一個信號為 aboutToShow,該信號在Qmenu展開時觸發。

所以:

在連接的槽函數里我們去添加:

void MyWord::updateWindowMenu()
{
//首先清空菜單,然后再添加各個菜單動作windowMenu->clear();windowMenu->addAction(closeAct);windowMenu->addAction(closeAllAct);windowMenu->addSeparator();windowMenu->addAction(tileAct);windowMenu->addAction(cascadeAct);windowMenu->addSeparator();windowMenu->addAction(nextAct);windowMenu->addAction(previousAct);windowMenu->addSeparator();//如果有活動窗口,則顯示分隔條QList<QMdiSubWindow*> windows=mdiArea->subWindowList();separatorAct->setVisible(!windows.isEmpty());//遍歷各個子窗口,顯示當前已打開的文檔子窗口項for(int i=1;i<windows.size();i++){MyChild *child=qobject_cast<MyChild*>(windows.at(i)->widget());QString text;if(i<9){text=tr("&%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());}else{text=tr("%1 %2").arg(i+1).arg(child->userFriendlyCurrentFile());}
//添加動作作到菜單,設置動作可以選擇QAction *action=windowMenu->addAction(text);action->setCheckable(true);//設置當前活動窗口動作作為選中狀態action->setChecked(child==activeMyChild());
//關聯動作的觸發信號到信號映射器的map()槽,這個槽會發送mapped()信號connect(action,SIGNAL(triggered()),windowMapper,SLOT(map()));
//動作作與相應的窗口部件進行映射,在發送mapped()信號時就會以這個窗口部件為參數windowMapper->setMapping(action,windows.at(i));}enabledText();//使得字體設置菜單可用
}

接下來就是要創建工具條了:

跟創建菜單行為其實差不多,就是函數名字稍微變了一下:

void MyWord::createToolBars()
{//文件fileToolBar=addToolBar(tr("文件"));fileToolBar->addAction(newAct);fileToolBar->addAction(openAct);fileToolBar->addSeparator();fileToolBar->addAction(saveAct);fileToolBar->addAction(printAct);//編輯editToolBar=addToolBar(tr("文件"));editToolBar->addAction(undoAct);editToolBar->addAction(redoAct);editToolBar->addSeparator();editToolBar->addAction(cutAct);editToolBar->addAction(copyAct);editToolBar->addAction(pasteAct);//格式formatToolBar=addToolBar(tr("格式"));formatToolBar->addAction(boldAct);formatToolBar->addAction(italicAct);formatToolBar->addAction(underlineAct);formatToolBar->addSeparator();formatToolBar->addAction(leftAlignAct);formatToolBar->addAction(rightAlignAct);formatToolBar->addAction(justifyAct);formatToolBar->addSeparator();formatToolBar->addAction(colorAct);//組合addToolBarBreak(Qt::TopToolBarArea);//comboToolBar=addToolBar(tr("組合選擇"));comboStyle=new QComboBox();comboToolBar->addWidget(comboStyle);comboStyle->addItem("標準");comboStyle->addItem("項目符號(●)");comboStyle->addItem("項目符號(○)");comboStyle->addItem("項目符號(□)");comboStyle->addItem("編號(1.2.3.)");comboStyle->addItem("編號(a.b.c.)");comboStyle->addItem("編號(A.B.C.)");comboStyle->addItem("編號(ⅰ.ⅱ.ⅲ.)");comboStyle->addItem("編號(Ⅰ.Ⅱ.Ⅲ.)");comboStyle->setStatusTip("段落加上標號或者編號");connect(comboStyle,SIGNAL(activated(int)),this,SLOT(textStyle(int)));comboFont=new QFontComboBox();comboToolBar->addWidget(comboFont);comboFont->setStatusTip("更改字體");connect(comboFont,SIGNAL(activated(QString)),this,SLOT(textFamily(QString)));comboSize=new QComboBox();comboToolBar->addWidget(comboSize);comboSize->setEditable(true);comboSize->setStatusTip("更改字體");QFontDatabase db;foreach(int size,db.standardSizes()){comboSize->addItem(QString::number(size));}
}

?把他們連接到對應槽函數,我們一步一步去實現就好了,

Qt foreach是一種用于遍歷容器類型的語法結構。與傳統的for循環相比,foreach更加易讀、易寫、易錯,由此減少代碼出錯的概率。Qt foreach在Qt 4.0中被引入,可以用于遍歷數組、QList、QVector、QSet、QMap和QHash等容器類型。

foreach (聲明變量, 容器) {……          
}

?接著我們把細節一點一點去完善:

//判斷是否有活動子窗口用activeMyChild()函數
MyChild *MyWord::activeMyChild()
{
//若有活動窗口,則將其內的中心部件轉換為MyChild類型,若沒有直接返回0if(QMdiSubWindow *activeSubWindows=mdiArea->activeSubWindow()){return  qobject_cast<MyChild*>(activeSubWindows->widget());}return 0;
}
//發現子窗口操作
QMdiSubWindow *MyWord::findMyChild(const QString &filename)
{/*canonicalFilePath ()可以除去路徑中符號鏈接,如“.”和“..”等符號。這個*函數只是將加載文件的路徑首先保存到canonicalFilePath中,然后再進行一些狀態的設置*/QString canonicalFilePath=QFileInfo(filename).canonicalFilePath();
//遍歷整個多文檔區域的所有子窗口foreach (QMdiSubWindow *window, mdiArea->subWindowList()) {MyChild *myChild=qobject_cast<MyChild*>(window->widget());if(myChild->currentFile()==canonicalFilePath){return window;}}return 0;
}
void MyWord::setActiveSubWindow(QWidget *window)
{if(!window){return;}mdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(window));
}
MyChild *MyWord::createMyChild()
{MyChild *child = new MyChild;mdiArea->addSubWindow(child);connect(child,SIGNAL(copyAvailable(bool)),cutAct,SLOT(setEnabled(bool)));connect(child,SIGNAL(copyAvailable(bool)),copyAct,SLOT(setEnabled(bool)));return  child;
}

還有其他一些動作的函數沒有實現,下一期就寫出來!!!

感謝閱讀!!!!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12338.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Cesium解讀】Cesium中primitive/entity貼地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推薦&#xff1a;Cesium貼地設置_primitive貼地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

釋放系統C盤的ext4.vhdx

ext4.vhdx 是個虛擬磁盤&#xff0c;默認位置為 C:\Users{用戶名}\AppData\Local\Docker\wsl\data\ext4.vhdx&#xff0c;會占用很大磁盤空間&#xff0c;可采用下列辦法將其改到其它磁盤或分區&#xff0c;如D分區。 1、查看有哪些&#xff1a; # wsl -l -vNAME …

靜態代碼掃描問題修復之--(輸入驗證 重定向[NodeJS])

問題描述: 當應用程序直接使用未經驗證的用戶輸入來控制重定向URL時,存在安全隱患。攻擊者可借此機會操縱輸入,引導用戶訪問惡意網站,實施網絡釣魚等攻擊。這在JavaScript前端代碼及Node.js后端邏輯中均需警惕。 案例分析: 應用程序允許未驗證的用戶輸入控制重定向中的UR…

MYSQL主從災難恢復

方案背景 MySQL一主一從,當主庫操作系統宕機無法啟動,vip已漂移到從庫,原從庫成為主庫單實例支撐業務。在新建主機上新建MySQL實例,配置為當前vip所在實例的從庫,恢復MySQL一主一從。 2 恢復步驟 2.1 新建MySQL實例 2.1.1 解壓安裝包 #將二進制包上傳至/usr/local/然后解…

Android Q - 音頻通路調試

對于當前模塊不是很清楚&#xff0c;剛好有個項目這方面有點問題&#xff0c;根據展銳支持文檔一步步檢查就可以了。首先得先弄清楚硬件具體是怎么連接的&#xff0c;比如文檔提到的案例&#xff1a;sprd codec speaker output 連接外部 PA。 耳機接的是什么&#xff0c;speake…

C/C++關鍵字:extern

文章目錄 一、extern&#xff1a;聲明外部變量或外部函數1.extern的作用2.代碼舉例①例1②例2③例3 一、extern&#xff1a;聲明外部變量或外部函數 1.extern的作用 extern的作用&#xff1a;聲明外部的全局變量或外部的函數&#xff0c;以實現跨文件使用其他.c/.h文件的全局…

【Vue】vue項目中使用高德地圖教程

在Vue項目中顯示高德地圖&#xff0c;你需要按照以下步驟進行 1. 注冊高德開發者賬號并獲取API密鑰2. 在Vue項目中引入高德地圖API3. 在Vue組件中創建地圖容器4. 在Vue組件中初始化地圖5. 添加其他地圖組件&#xff08;可選&#xff09;6. 處理地圖事件&#xff08;可選&#x…

[鏈表專題]力扣82

1. 力扣82 : 刪除排序鏈表中的重復元素 題 : 給定一個已排序的鏈表的頭 head &#xff0c; 刪除原始鏈表中所有重復數字的節點&#xff0c;只留下不同的數字 。返回 已排序的鏈表 。示例 1&#xff1a;輸入&#xff1a;head [1,2,3,3,4,4,5] 輸出&#xff1a;[1,2,5] 示例 …

【YOLO改進】換遍MMDET主干網絡之Pyramid Vision Transformer(PVT)(基于MMYOLO)

Pyramid Vision Transformer&#xff08;PVT&#xff09; Pyramid Vision Transformer&#xff08;PVT&#xff09;是一種深度學習模型&#xff0c;它結合了Transformer架構和金字塔結構&#xff0c;旨在將Transformer的強大能力引入計算機視覺任務中&#xff0c;特別是那些需…

如何深入理解業務需求和業務流程?

要深入理解業務需求和業務流程&#xff0c;可以嘗試以下方法&#xff1a; 1. 積極參與需求討論&#xff1a;在相關會議中認真聆聽&#xff0c;提出問題&#xff0c;與業務人員充分交流。 2. 研讀業務文檔&#xff1a;仔細分析業務規劃、產品說明等文檔&#xff0c;梳理出關鍵…

SQL練習題2.1

建表 # 學生表 create table t_student (stu_id varchar(10),stu_name varchar(10),stu_age datetime,stu_sex varchar(10) );# 課程表 create table t_t_course (c_id varchar(10),c_name varchar(10),c_teaid varchar(10) );# 教師表 create table t_t_teacher (tea…

C語言中數組與指針的區別

一. 簡介 本文學習了 C語言中數組與指針的區別。這樣的話&#xff0c;可以在編寫C代碼時規避掉出錯的問題。 二. C語言中數組與指針的區別 1. 數組 定義字符串數組時&#xff0c;必須讓編譯器知道需要多少空間。 一種方法是用足夠空間的數組存儲字符串。例如如下&#xf…

DOM重點核心(注冊事件+DOM事件流)

目錄 1.注冊事件 注冊時間概述 addEventListener() 刪除事件 2.DOM事件流 DOM事件流理論 事件對象 事件對象的常見屬性和方法 e.targe 和 this的區別 阻止默認行為 阻止冒泡 事件委托 禁止右鍵菜單和禁止選中文字 獲得鼠標的坐標&#xff08;可視區、頁面、瀏覽器…

js原生彈框多選框

js原生彈框多選框 代碼如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>JavaS…

golang適配國產數據庫

隨著國產化的推進&#xff0c;越來越多的企業選擇國產數據庫替代mysql或者Oracle。 本篇主要介紹golang如何適配國產數據庫 主流的國產數據庫有達夢&#xff0c;金倉&#xff0c;神通&#xff0c;優炫&#xff0c;南大通用數據庫等 前提環境 unixODBC安裝 yum -y install un…

【深度學習實戰(36)】模型轉換之onnx模型轉地平線J3 二進制bin模型

一、PTQ量化流程 &#xff08;1&#xff09; 核查onnx模型 &#xff08;2&#xff09;準備和生成模型校準數據集 &#xff08;3&#xff09;PTQ量化 &#xff08;4&#xff09;量化模型推理 二、具體流程 &#xff08;1&#xff09;使用01_check_onnx.sh腳本&#xff0c;對o…

Spring6 源碼分析-ioc

&#xff08;1&#xff09;IDEA開發工具&#xff1a;2022.1.2 &#xff08;2&#xff09;JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; &#xff08;3&#xff09;Spring&#xff1a;6.0.2 <dependencies><!--spring context依賴…

【教程】Linux/Jetson 安裝X11VNC同步屏幕內容

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;請不吝給個[點贊、收藏、關注]哦~ 目錄 背景說明 實際效果 安裝步驟 安裝 x11vnc 配置 x11vnc 配置 x11vnc 作為系統服務 使用 VNC 客戶端連接 背景說明 通常vnc-server是單…

分享一個非常好用的安裝包下載網站

當我們需要下載linux下的某些包,以便在自己的環境下進行編譯自己的安裝包的時候,可能需要用到一些各種版本的依賴包,從網上 百度會很麻煩。 這里分享一個很好用的安裝包下載網站,記得點贊收藏 網站: Red Hat Enterprise Linux Repositories - pkgs.org 找到對應系統,然…

深入理解K8S【安全認證機制kubectlconfig】

深入理解K8S【安全認證機制】 1 核心概念 1.1 安全體系 對于大型系統來說&#xff0c;對業務的權限、網絡的安全認證是必不可少的。 對于linux系統來說&#xff0c;用戶和組、文件權限、SELinux、防火墻、pam、sudo等&#xff0c;究其核心的目的都是為了保證系統是安全的。 …