複数のドキュメント インターフェイス MDI
MDI アプリケーションは、メイン ウィンドウ内に同じ種類の複数の MDI サブウィンドウを作成し、これらの MDI サブウィンドウはメイン ウィンドウに表示され、メイン ウィンドウ上のツールバーやメニューなどの操作機能を共有します。現在の状況に固有のアクティブな MDI 子ウィンドウが作成されます。
MDI アプリケーションを設計するには、QMdiArea をサブフォームのコンテナとしてメイン ウィンドウのワークスペースに配置する必要があります。
1. メインウィンドウのインターフェースデザイン
メイン ウィンドウに MDI 機能を実装するには、メイン ウィンドウのワークスペースに QMdiArea コンポーネントを配置するだけです。図 1 は、設計されたメイン ウィンドウ インターフェイスです。
UI デザイナーでアクションを作成し、そのアクションを使用してメイン ツールバーをデザインします。QMdiArea コンポーネントをメイン ウィンドウのワークスペースに配置し、メイン ウィンドウのコンストラクターでワークスペースを満たすように mdiArea を設定します。
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);
}
2. MDIサブウィンドウの作成と追加
メイン ウィンドウの [新しいドキュメント] ボタンの応答コードは次のとおりです。
void QWMainWindow::on_actDoc_New_triggered()
{
//新建文档
QFormDoc *formDoc = new QFormDoc(this);
ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
formDoc->show();
}
コードの機能は、QFormDoc クラスの新しいウィンドウ formDoc を作成することです。メイン ウィンドウ ポインターがコンストラクターに渡されるため、メイン ウィンドウは formDoc の親ウィンドウとなり、addSubWindow を使用して formDoc が mdiArea に追加されますQMdiAreaの()関数。
メイン ウィンドウの [ドキュメントを開く] ボタンの応答コードは次のとおりです。
void QWMainWindow::on_actDoc_Open_triggered()
{
//打开文件
bool needNew=false;// 是否需要新建子窗口
QFormDoc *formDoc;
if (ui->mdiArea->subWindowList().count()>0) //获取活动窗口
{
formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
needNew=formDoc->isFileOpened();//文件已经打开,需要新建窗口
}
else
needNew=true;
QString curPath=QDir::currentPath();
QString aFileName=QFileDialog::getOpenFileName(this,"打开一个文件",
curPath, "C程序文件(*.h *cpp);;所有文件(*.*)");
if (aFileName.isEmpty())
return;
if (needNew) //需要新建子窗口
{
formDoc = new QFormDoc(this);
ui->mdiArea->addSubWindow(formDoc);
}
formDoc->loadFromFile(aFileName); //打开文件
formDoc->show();
ui->actCut->setEnabled(true);
ui->actCopy->setEnabled(true);
ui->actPaste->setEnabled(true);
ui->actFont->setEnabled(true);
}
サブウィンドウ オブジェクトのリストは QMdiArea::subWindowList() を通じて取得できるため、サブウィンドウの数を決定できます。MDI 子ウィンドウがない場合は、新しいウィンドウを作成してファイルを開きます。
MDI サブウィンドウがある場合は、常にアクティブなウィンドウが存在します。このアクティブなサブウィンドウは、QMdiArea::activeSubWindow() を通じて取得できます。サブウィンドウの isFileOpened() 関数を使用して、ファイルが開いているかどうかを確認しますファイルが開かれていない場合は、このアクティブなウィンドウでファイルを開くだけで、そうでない場合は、新しいウィンドウでファイルを開きます。
知らせ注:
必ず最初に MDI サブウィンドウを取得してから、QFileDialog を使用して開くファイルを選択してください。順序を変更すると、正しい MDI アクティブ子ウィンドウが取得できなくなります。
3.QMdiArea共通関数
QMdiArea には、一部の操作を実行できるメンバー関数が用意されており、ツールバーの「すべて閉じる」、「MDI モード」、「カスケード展開」、「タイル展開」などのボタンはすべて QMdiArea クラスのメンバー関数を呼び出すことで実装されます。これらのボタン機能の実装コードは次のとおりです。
void QWMainWindow::on_actCascade_triggered()
{
//窗口级联展开
ui->mdiArea->cascadeSubWindows();
}
void QWMainWindow::on_actTile_triggered()
{
//平铺展开
ui->mdiArea->tileSubWindows();
}
void QWMainWindow::on_actCloseALL_triggered()
{
//关闭全部子窗口
ui->mdiArea->closeAllSubWindows();
}
void QWMainWindow::on_actViewMode_triggered(bool checked)
{
//MDI 显示模式
if (checked) //Tab多页显示模式
{
ui->mdiArea->setViewMode(QMdiArea::TabbedView); //Tab多页显示模式
ui->mdiArea->setTabsClosable(true); //页面可关闭
ui->actCascade->setEnabled(false);
ui->actTile->setEnabled(false);
}
else //子窗口模式
{
ui->mdiArea->setViewMode(QMdiArea::SubWindowView); //子窗口模式
ui->actCascade->setEnabled(true);
ui->actTile->setEnabled(true);
}
}
このうち、setViewMode() 関数は MDI ビュー モードを設定するために使用され、2 つのモードから選択できます。
QMdiArea::SubWindowView は、従来のサブウィンドウ モードです。
QMdiArea::TabbedView は、複数ページの表示モードです。
4. MDI信号
QMdiArea には信号 subWindowActivated(QMdiSubWindow *arg1) があり、現在のアクティブ ウィンドウが切り替わったときに発行されます。この信号は、アクティブ ウィンドウが切り替わったときに何らかの処理を実行するために使用できます。たとえば、アクティブな MDI サブウィンドウのファイル名などです。ステータスバーにウィンドウが表示される MDI がない場合 サブウィンドウを開くときは、ツールバーの編集機能ボタンを無効に設定してください。この信号のスロット機能コードは次のとおりです。
void QWMainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
//当前活动子窗口切换时
if (ui->mdiArea->subWindowList().count()==0)
{
//若子窗口个数为零
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());
}
}
メイン ウィンドウのツールバーにある [切り取り]、[コピー]、[貼り付け]、および [フォント設定] ボタンはすべて、現在のサブウィンドウの対応する機能を呼び出します。重要なのは、たとえば、現在の MDI サブフォーム オブジェクトを取得することです。 、「切り取り」、「 「フォント設定」ボタンのコードは次のとおりです。
void QWMainWindow::on_actCut_triggered()
{
//cut操作
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->textCut();
}
void QWMainWindow::on_actFont_triggered()
{
//设置字体
QFormDoc* formDoc=(QFormDoc*)ui->mdiArea->activeSubWindow()->widget();
formDoc->setEditFont();
}