返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++ Qt MdiArea 多窗体组件应用教程
  • 718
分享到

C/C++ Qt MdiArea 多窗体组件应用教程

2024-04-02 19:04:59 718人浏览 薄情痞子
摘要

MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们

MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。

MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制。

这个Dialog对话框我们只增加两个功能,一个Dialog::currentFileName()获取窗体标题,另一个Dialog::SetData(QString data)设置数据到编辑框,代码实现如下.


#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
    ui->setupUi(this);

    this->setWindowTitle("New Doc <By: LyShark >");           // 窗口标题
    this->setAttribute(Qt::WA_DeleteOnClose);  // 关闭时自动删除
    this->setFixedSize(200,100);               // 设置窗体大小
    // this->setWindowIcon(QIcon(":/image/1.ico"));
}

Dialog::~Dialog()
{
    delete ui;
}

// 获取窗体标题
// By: LyShark
QString Dialog::currentFileName()
{
    QString title = this->windowTitle();
    return title;
}

// 设置编辑框内容
// https://www.cnblogs.com/lyshark
void Dialog::SetData(QString data)
{
    ui->lineEdit->setText(data);
}

接着我们开始绘制这个程序的主界面,在toolBar中增加相应的菜单栏,并在主窗体中放入mdiArea容器组件。

窗体中的顶部菜单栏,我们需要手动定义一下他们所具备的功能名称等。

当程序启动后,程序调用MainWindow初始化这个窗体,初始化代码如下:


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include <iOStream>
#include <QCloseEvent>

// 如果直接关闭,则清空所有对话框
// Https://www.cnblogs.com/lyshark
void MainWindow::closeEvent(QCloseEvent *event)
{
    ui->mdiArea->closeAllSubwindows();
    event->accept();
}

// By: LyShark
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;
}

代码运行效果如下:

用户新建窗体执行MainWindow::on_actionOpen_triggered()事件,关闭窗体时则执行MainWindow::on_actionClose_triggered()事件。


// 新建窗体
void MainWindow::on_actionOpen_triggered()
{
    Dialog *fORMDoc = new Dialog(this); //
    ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
    formDoc->show(); //在单独的窗口中显示
}
// 关闭全部
void MainWindow::on_actionClose_triggered()
{
    ui->mdiArea->closeAllSubWindows(); //关闭所有子窗口
}

代码运行效果如下:

当用户点击MDI模式时,我们则执行以下代码,将所有已存在的窗体合并为一个类似于TabWidget的窗体组件。


// 转为MID模式
void MainWindow::on_actionMID_triggered(bool checked)
{
    // Tab多页显示模式
    if (checked)
    {
        ui->mdiArea->setViewMode(QMdiArea::TabbedView); // Tab多页显示模式
        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);
    }
}

代码运行效果如下:

窗体级联模式则是将窗体并排排列在一起,我们只需要调用ui->mdiArea->cascadeSubWindows();方法即可实现.


// 级联模式
void MainWindow::on_actionLine_triggered()
{
    ui->mdiArea->cascadeSubWindows();
}

代码运行效果如下:

平铺模式同样使用ui->mdiArea->tileSubWindows();即可实现转换。


// 平铺模式
void MainWindow::on_actionTile_triggered()
{
    ui->mdiArea->tileSubWindows();
}

代码运行效果如下:

最后一个功能是主窗体发送数据到子窗体,该功能的实现需要两个函数。

  • on_mdiArea_subWindowActivated 实现设置主窗体名字到自身
  • on_actionSendMsg_triggered 实现主窗体发送消息到子窗体内

// 当子窗体打开时获取到其窗体标题
// By: LyShark
void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
    Q_UNUSED(arg1);

    // 若子窗口个数为零,则将statusBar置空
    if (ui->mdiArea->subWindowList().count()==0)
    {
        ui->statusBar->clearMessage();
    }
    else
    {
        // 如果不为0则显示主窗口的文件名
        Dialog *formDoc=static_cast<Dialog*>(ui->mdiArea->activeSubWindow()->widget());
        ui->statusBar->showMessage(formDoc->currentFileName());
    }
}

// 对选中窗体发送数据
// https://www.cnblogs.com/lyshark
void MainWindow::on_actionSendMsg_triggered()
{
    // 先获取当前MDI子窗口
    Dialog *formDoc;

    // 如果打开则获取活动窗体
    if (ui->mdiArea->subWindowList().count() > 0)
    {
        formDoc=(Dialog*)ui->mdiArea->activeSubWindow()->widget();
        // 对活动窗体设置数据
        formDoc->SetData("hello lyshark");
    }
}

代码运行效果如下:

文章出处:https://www.cnblogs.com/lyshark
版权声明: 本博客文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!

博主警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!

到此这篇关于C/C++ Qt MdiArea 多窗体组件应用的文章就介绍到这了,更多相关c++ Qt MdiArea 多窗体组件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C/C++ Qt MdiArea 多窗体组件应用教程

本文链接: https://lsjlt.com/news/158852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C/C++ Qt MdiArea 多窗体组件应用教程
    MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们...
    99+
    2024-04-02
  • C++的Qt MdiArea多窗体组件怎么使用
    本篇内容主要讲解“C++的Qt MdiArea多窗体组件怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++的Qt MdiArea多窗体组件怎么使用”吧!MDI窗体控...
    99+
    2023-06-21
  • C/C++ Qt数据库与SqlTableModel组件应用教程
    SqlTableModel 组件可以将数据库中的特定字段动态显示在TableView表格组件中,通常设置QSqlTableModel类的变量作为数据模型后就可以显示数据表内容,界面组...
    99+
    2024-04-02
  • C/C++ Qt TabWidget如何实现多窗体创建
    这篇文章主要为大家展示了“C/C++ Qt TabWidget如何实现多窗体创建”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C/C++ Qt TabWi...
    99+
    2023-06-21
  • C/C++ Qt TabWidget 实现多窗体创建详解
    在开发窗体应用时通常会伴随分页,TabWidget组件配合自定义Dialog组件,可实现一个复杂的多窗体分页结构,此类结构也是ERP等软件通用的窗体布局方案。 首先先来实现一个只有T...
    99+
    2024-04-02
  • C/C++ Qt 数据库QSql增删改查组件应用教程
    Qt SQL模块是Qt中用来操作数据库的类,该类封装了各种SQL数据库接口,可以很方便的链接并使用,数据的获取也使用了典型的Model/View结构,通过MV结构映射我们可以实现数据...
    99+
    2024-04-02
  • C/C++表格组件Qt TableWidget应用详解
    TableWidget 表格结构组件,该组件可以看作是TreeWidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直...
    99+
    2024-04-02
  • 详解C/C++ QT QChart 绘制组件应用
    QtCharts 组件是QT中提供图表绘制的模块,该模块可以方便的绘制常规图形,Qtcharts 组件基于GraphicsView模式实现,其核心是QChartView和QChart...
    99+
    2024-04-02
  • C/C++ Qt QThread线程组件的具体使用是怎样的
    这期内容当中小编将会给大家带来有关C/C++ Qt QThread线程组件的具体使用是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。QThread库是QT中提供的跨平台多线程实现...
    99+
    2023-06-21
  • C/C++ Qt Dialog 对话框组件应用技巧
    在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,...
    99+
    2024-04-02
  • C/C++ Qt StatusBar底部状态栏应用教程
    Qt窗体中默认会附加一个QstatusBar组件,状态栏组件位于主窗体的最下方,其作用是提供一个工具提示功能,当程序中有提示信息是可以动态的显示在这个区域内,状态栏组件内可以增加任何...
    99+
    2024-04-02
  • C/C++ Qt TreeWidget单层树形组件怎么应用
    本篇内容主要讲解“C/C++ Qt TreeWidget单层树形组件怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C/C++ Qt TreeWid...
    99+
    2023-06-21
  • C/C++ Qt TreeWidget 单层树形组件应用小结
    TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView组件使用,因为ListView每次只能显示一列数据集,而使用...
    99+
    2024-04-02
  • C#Windows应用程序开发实现窗体控件
    本篇内容主要讲解“C#Windows应用程序开发实现窗体控件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#Windows应用程序开发实现窗体控件”吧!通常windows应用程序都有相似的特征...
    99+
    2023-06-18
  • c#窗体应用程序怎么打包
    问题:如何打包 c# 窗体应用程序?答案:通过 visual studio 发布应用程序,选择文件夹作为部署目标,配置发布设置,生成发布包并将其安装在目标计算机上。具体步骤:发布应用程序...
    99+
    2024-05-12
    c#
  • C/C++ Qt ToolBar菜单组件的具体使用是怎样的
    C/C++ Qt ToolBar菜单组件的具体使用是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ToolBar工具栏在所有窗体应用程...
    99+
    2023-06-21
  • C#Windows应用程序开发创建窗体
    本篇内容主要讲解“C#Windows应用程序开发创建窗体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#Windows应用程序开发创建窗体”吧!C#Windows应用程序开发之创建窗体的前言:...
    99+
    2023-06-18
  • 如何分析C/C++ Qt数据库与SqlTableModel组件应用
    今天就跟大家聊聊有关如何分析C/C++ Qt数据库与SqlTableModel组件应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。SqlTableModel 组件可以将数...
    99+
    2023-06-22
  • C/C++ Qt QChart绘图组件的具体使用是怎么样的
    这篇文章给大家介绍C/C++ Qt QChart绘图组件的具体使用是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。QtCharts 组件是QT中提供图表绘制的模块,该模块可以方便的绘制常规图...
    99+
    2023-06-21
  • C/C++QtQThread线程组件的具体使用
    QThread库是QT中提供的跨平台多线程实现方案,使用时需要继承QThread这个基类,并重写实现内部的Run方法,由于该库是基本库,默认依赖于QtCore.dll这个基础模块,在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作