目錄
1 MDI簡(jiǎn)介
2 文檔窗口類(lèi)QFormDoc的設(shè)計(jì)
3 MDI主窗口設(shè)計(jì)與子窗口的使用
3.1 主窗口界面設(shè)計(jì)
3.2 MDI子窗口的創(chuàng)建與加入
3.3 QMdiArea常用功能函數(shù)
3.4 MDI的信號(hào)
1 MDI簡(jiǎn)介

2 文檔窗口類(lèi)QFormDoc的設(shè)計(jì)
class QFormDoc : public QWidget
{
Q_OBJECT
private:
QString mCurrentFile; //當(dāng)前文件
bool mFileOpened=false; //文件已打開(kāi)
public:
explicit QFormDoc(QWidget *parent = 0);
~QFormDoc();
void loadFromFile(QString& aFileName); //打開(kāi)文件
QString currentFileName();//返回當(dāng)前文件名
bool isFileOpened();//文件已經(jīng)打開(kāi)
void setEditFont();//設(shè)置字體
void textCut(); //cut
void textCopy(); //copy
void textPaste(); //paste
private:
Ui::QFormDoc *ui;
};
????????????????這些接口函數(shù)是為了在主窗口里調(diào)用,實(shí)現(xiàn)對(duì)MDI子窗口的操作。實(shí)現(xiàn)代碼如下:
QFormDoc::QFormDoc(QWidget *parent) :
QWidget(parent),
ui(new Ui::QFormDoc)
{
ui->setupUi(this);
this->setWindowTitle("New Doc"); //窗口標(biāo)題
this->setAttribute(Qt::WA_DeleteOnClose); //關(guān)閉時(shí)自動(dòng)刪除
}
QFormDoc::~QFormDoc()
{
QMessageBox::information(this,"信息","文檔窗口被釋放");
delete ui;
}
void QFormDoc::loadFromFile(QString &aFileName)
{//打開(kāi)文件
QFile aFile(aFileName); //以文件方式讀出
if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以只讀文本方式打開(kāi)文件
{
QTextStream aStream(&aFile); //用文本流讀取文件
ui->plainTextEdit->clear();//清空
ui->plainTextEdit->setPlainText(aStream.readAll()); //讀取文本文件
aFile.close();//關(guān)閉文件
mCurrentFile=aFileName;//保存當(dāng)前文件名
QFileInfo fileInfo(aFileName); //文件信息
QString str=fileInfo.fileName(); //去除路徑后的文件名
this->setWindowTitle(str);
mFileOpened=true;
}
}
QString QFormDoc::currentFileName()
{
return mCurrentFile;
}
bool QFormDoc::isFileOpened()
{ //文件是否已打開(kāi)
return mFileOpened;
}
void QFormDoc::setEditFont()
{
QFont font;
font=ui->plainTextEdit->font();
bool ok;
font=QFontDialog::getFont(&ok,font);
ui->plainTextEdit->setFont(font);
}
void QFormDoc::textCut()
{
ui->plainTextEdit->cut();
}
void QFormDoc::textCopy()
{
ui->plainTextEdit->copy();
}
void QFormDoc::textPaste()
{
ui->plainTextEdit->paste();
}
3 MDI主窗口設(shè)計(jì)與子窗口的使用
3.1 主窗口界面設(shè)計(jì)

QWMainWindow::QWMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QWMainWindow)
{
ui->setupUi(this);
this->setCentralWidget(ui->mdiArea);
this->setWindowState(Qt::WindowMaximized); //窗口最大化顯示
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
}
3.2 MDI子窗口的創(chuàng)建與加入
void QWMainWindow::on_actDoc_New_triggered()
{ //新建文件
QFormDoc *formDoc = new QFormDoc(this); //
ui->mdiArea->addSubWindow(formDoc); //文檔窗口添加到MDI
formDoc->show(); //在單獨(dú)的窗口中顯示
}
? ? ? ? 代碼功能是新建一個(gè)QFormDoc類(lèi)的窗口formDoc,構(gòu)造函數(shù)中傳入了主窗口指針,所以主窗口是formDoc的父窗口,然后使用QMdiArea的addSubWindow()函數(shù)將formDoc加入到mdiArea。
?? ??? ?下面是主窗口上“打開(kāi)文檔”按鈕的響應(yīng)代碼:
void QWMainWindow::on_actDoc_Open_triggered()
{//打開(kāi)文件
//必須先獲取當(dāng)前MDI子窗口,再使用打開(kāi)文件對(duì)話(huà)框,否則無(wú)法獲得活動(dòng)的子窗口
bool needNew=false;// 是否需要新建子窗口
QFormDoc *formDoc;
if (ui->mdiArea->subWindowList().count()>0) //如果有打開(kāi)的主窗口,獲取活動(dòng)窗口
{
formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
needNew=formDoc->isFileOpened();//文件已經(jīng)打開(kāi),需要新建窗口
}
else
needNew=true;
QString curPath=QDir::currentPath();
QString aFileName=QFileDialog::getOpenFileName(this,tr("打開(kāi)一個(gè)文件"),curPath,
"C程序文件(*.h *cpp);;文本文件(*.txt);;所有文件(*.*)");
if (aFileName.isEmpty())
return; //如果未選擇文件,退出
if (needNew) //需要新建子窗口
{
formDoc = new QFormDoc(this);//指定父窗口,必須在父窗口為Widget窗口提供一個(gè)顯示區(qū)域
ui->mdiArea->addSubWindow(formDoc);
}
formDoc->loadFromFile(aFileName); //打開(kāi)文件
formDoc->show();
ui->actCut->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actFont->setEnabled(true);
}
3.3 QMdiArea常用功能函數(shù)
void QWMainWindow::on_actViewMode_triggered(bool checked)
{//MDI 顯示模式
if (checked) //Tab多頁(yè)顯示模式
{
ui->mdiArea->setViewMode(QMdiArea::TabbedView); //Tab多頁(yè)顯示模式
ui->mdiArea->setTabsClosable(true); //頁(yè)面可關(guān)閉
ui->actCascade->setEnabled(false);
ui->actTile->setEnabled(false);
}
else 子窗口模式
{
ui->mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式
ui->actCascade->setEnabled(true); //
ui->actTile->setEnabled(true); //
}
}
void QWMainWindow::on_actCascade_triggered()
{ //窗口級(jí)聯(lián)展開(kāi)
ui->mdiArea->cascadeSubWindows();
}
void QWMainWindow::on_actTile_triggered()
{//平鋪展開(kāi)
ui->mdiArea->tileSubWindows();
}
void QWMainWindow::on_actCloseALL_triggered()
{//關(guān)閉全部子窗口
ui->mdiArea->closeAllSubWindows();
}
其中,設(shè)置MDI視圖模式用setViewMode()函數(shù),有兩種模式可以選擇。
?? ?*?QMdiArea::SubWindowView是傳統(tǒng)的子窗口模式,顯示效果如圖6-14所示。
?? ?*?QMdiArea::TabbedView是多頁(yè)的顯示模式,顯示效果如圖6-16所示。
圖6-16多頁(yè)模式下的MDI界面
3.4 MDI的信號(hào)
? ? ? ? QMdiArea有一個(gè)信號(hào)subWindowActivated(QMdiSubWindow*argl),在當(dāng)前活動(dòng)窗口切換時(shí)發(fā)射,利用此信號(hào)可以在活動(dòng)窗口切換時(shí)進(jìn)行一些處理,例如,在狀態(tài)欄里顯示活動(dòng)MDI子窗口的文件名,在沒(méi)有MDI子窗口時(shí),將工具欄上的編輯功能按鈕設(shè)置為禁用。下面是該信號(hào)的槽函數(shù)代碼:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-822818.html
void QWMainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{//當(dāng)前活動(dòng)子窗口切換時(shí)
if (ui->mdiArea->subWindowList().count()==0)
{ //若子窗口個(gè)數(shù)為零
ui->actCut->setEnabled(false);
ui->actCopy->setEnabled(false);
ui->actPaste->setEnabled(false);
ui->actFont->setEnabled(false);
ui->statusBar->clearMessage();
}
else
{
QFormDoc *formDoc=static_cast<QFormDoc*>(ui->mdiArea->activeSubWindow()->widget());
ui->statusBar->showMessage(formDoc->currentFileName()); //顯示主窗口的文件名
}
}
??? ?主窗口工具欄上的“剪切”“復(fù)制”“粘貼”“字體設(shè)置”等按鈕都是調(diào)用當(dāng)前子窗口的相應(yīng)函數(shù),關(guān)鍵是獲取當(dāng)前MDI子窗體對(duì)象,例如,“剪切”和“字體設(shè)置”按鈕的代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-822818.html
void QWMainWindow::on_actCut_triggered()
{ //cut
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->textCut();
}
void QWMainWindow::on_actFont_triggered()
{//設(shè)置字體
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->setEditFont();
}
到了這里,關(guān)于【QT】MDI應(yīng)用程序設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!