【QT】MDI应用程序设计

这篇具有很好参考价值的文章主要介绍了【QT】MDI应用程序设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 MDI简介

2 文档窗口类QFormDoc的设计

3 MDI主窗口设计与子窗口的使用

3.1 主窗口界面设计

3.2 MDI子窗口的创建与加入

3.3 QMdiArea常用功能函数

3.4 MDI的信号

1 MDI简介

        传统的应用程序设计中有多文档界面(Multi-documentInterface,MDI)应用程序,Qt为设计
MDI应用程序提供了支持。
        本节的实例samp6_4是一个MDI应用程序,程序运行效果如图6-14所示。MDI应用程序就
是在主窗口里创建多个同类型的MDI子窗口,这些MDI子窗口在主窗口里显示,并共享主窗口
上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的MDI子窗口进行。
        设计MDI应用程序需要在主窗口工作区放置一个QMdiArea作为子窗体的容器。实例samp6_4
主窗口的工作区使用一个QMdiArea组件,实例的子窗口类是QFormDoc,是一个使用QPlainTextEdit进行简单文本显示和编辑的窗体。
【QT】MDI应用程序设计,Qt,qt,开发语言,MDI
图6-14 MDI应用程序实例samp6_4的运行时界面
        创建的QFormDoc窗体对象作为一个子窗口加入到mdiArea组件中。QMdiArea组件类似于 实例 samp6_3 中主窗口上的 tabWidget 组件,只是 QMdiArea 提供更加完备的功能。更改 MDI 的 显示模式,可以得到与实例 samp6_3 相似的以多页组件管理的 MDI 界面效果。

2 文档窗口类QFormDoc的设计

        以可视化方式创建一个基于QWidget的类QFormDoc,设计可视化界面时,只放置一个 QPlainTextEdit组件,并以水平布局填充满整个窗口。这里不再用可视化的方式设计Action,因为 QFormDoc窗口不需要创建自己的工具栏,而是使用主窗口上的工具栏按钮对QFormDoc窗体上
的QPlainTextEdit组件进行操作。
        为QFormDoc添加一些用于文件打开和编辑操作的接口函数,QFormDoc类的完整定义如下:
class QFormDoc : public QWidget
{
    Q_OBJECT

private:
    QString mCurrentFile; //当前文件
    bool    mFileOpened=false; //文件已打开

public:
    explicit QFormDoc(QWidget *parent = 0);
    ~QFormDoc();

    void    loadFromFile(QString& aFileName); //打开文件
    QString currentFileName();//返回当前文件名
    bool    isFileOpened();//文件已经打开

    void    setEditFont();//设置字体
    void    textCut(); //cut
    void    textCopy(); //copy
    void    textPaste(); //paste

private:
    Ui::QFormDoc *ui;

};

                这些接口函数是为了在主窗口里调用,实现对MDI子窗口的操作。实现代码如下:

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

    this->setWindowTitle("New Doc"); //窗口标题
    this->setAttribute(Qt::WA_DeleteOnClose); //关闭时自动删除
}

QFormDoc::~QFormDoc()
{
    QMessageBox::information(this,"信息","文档窗口被释放");
    delete ui;
}

void QFormDoc::loadFromFile(QString &aFileName)
{//打开文件
    QFile aFile(aFileName);  //以文件方式读出
    if (aFile.open(QIODevice::ReadOnly | QIODevice::Text)) //以只读文本方式打开文件
    {
        QTextStream aStream(&aFile); //用文本流读取文件
        ui->plainTextEdit->clear();//清空
        ui->plainTextEdit->setPlainText(aStream.readAll()); //读取文本文件
        aFile.close();//关闭文件

        mCurrentFile=aFileName;//保存当前文件名
        QFileInfo   fileInfo(aFileName); //文件信息
        QString str=fileInfo.fileName(); //去除路径后的文件名
        this->setWindowTitle(str);
        mFileOpened=true;
    }
}

QString QFormDoc::currentFileName()
{
    return  mCurrentFile;
}

bool QFormDoc::isFileOpened()
{ //文件是否已打开
    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();
}
         注意:作为MDI子窗口,不管其是否设置为关闭时删除,在主窗口里关闭一个MDI子窗口时,都会删除子 窗口对象。

3 MDI主窗口设计与子窗口的使用

3.1 主窗口界面设计

        要在主窗口实现MDI功能,只需在主窗口的工作区放置一个QMdiArea组件。图6·-15是设计 好的主窗口界面。
【QT】MDI应用程序设计,Qt,qt,开发语言,MDI
图6-15 设计时的主窗口
        在UI设计器里创建Action,并应用Action设计主工具栏。在主窗口的工作区放置一个 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);
}

3.2 MDI子窗口的创建与加入

        下面是主窗口上“新建文档”按钮的响应代码:
void QWMainWindow::on_actDoc_New_triggered()
{ //新建文件
    QFormDoc *formDoc = new QFormDoc(this); //
    ui->mdiArea->addSubWindow(formDoc); //文档窗口添加到MDI
    formDoc->show(); //在单独的窗口中显示
}

        代码功能是新建一个QFormDoc类的窗口formDoc,构造函数中传入了主窗口指针,所以主窗口是formDoc的父窗口,然后使用QMdiArea的addSubWindow()函数将formDoc加入到mdiArea。

        下面是主窗口上“打开文档”按钮的响应代码:

void QWMainWindow::on_actDoc_Open_triggered()
{//打开文件
//必须先获取当前MDI子窗口,再使用打开文件对话框,否则无法获得活动的子窗口
    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,tr("打开一个文件"),curPath,
                 "C程序文件(*.h *cpp);;文本文件(*.txt);;所有文件(*.*)");
    if (aFileName.isEmpty())
        return; //如果未选择文件,退出

    if (needNew) //需要新建子窗口
    {
        formDoc = new QFormDoc(this);//指定父窗口,必须在父窗口为Widget窗口提供一个显示区域
        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.3 QMdiArea常用功能函数

        QMdiArea提供了一些成员函数,可以进行一些操作,工具栏上的“关闭全部”“MDI模式” “级联展开”“平铺展开”等按钮都是调用QMdiArea类的成员函数实现的。下面是这几个按钮功 能的实现代码:
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); //
    }
}

void QWMainWindow::on_actCascade_triggered()
{ //窗口级联展开
    ui->mdiArea->cascadeSubWindows();
}

void QWMainWindow::on_actTile_triggered()
{//平铺展开
    ui->mdiArea->tileSubWindows();
}

void QWMainWindow::on_actCloseALL_triggered()
{//关闭全部子窗口
    ui->mdiArea->closeAllSubWindows();
}

其中,设置MDI视图模式用setViewMode()函数,有两种模式可以选择。
    * QMdiArea::SubWindowView是传统的子窗口模式,显示效果如图6-14所示。
    * QMdiArea::TabbedView是多页的显示模式,显示效果如图6-16所示。

【QT】MDI应用程序设计,Qt,qt,开发语言,MDI

图6-16多页模式下的MDI界面

3.4 MDI的信号


        QMdiArea有一个信号subWindowActivated(QMdiSubWindow*argl),在当前活动窗口切换时发射,利用此信号可以在活动窗口切换时进行一些处理,例如,在状态栏里显示活动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子窗体对象,例如,“剪切”和“字体设置”按钮的代码如下:文章来源地址https://www.toymoban.com/news/detail-822818.html

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();
}

到了这里,关于【QT】MDI应用程序设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Qt】如何在Qt应用程序中使用设计好的UI文件

    本质上,Qt Designer的ui文件是一个以XML格式书写的文件,文件中内容描述了一个界面的widget关系树。这个文件在以下两种情况下会使用到: (1)在编译的时候,这意味着ui文件将被转换为可编译的c++代码,这个过程由 uic 完成。 (2)在应用程序运行的时候,ui文件将由 QUiLoa

    2024年01月16日
    浏览(45)
  • Qt应用开发(基础篇)——MDI窗口 QMdiArea QMdiSubWindow

             QMdiArea 类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt用来显示MDI窗口的部件。        滚屏区域基类 QAbstractScrollArea https://blog.csdn.net/u014491932/article/details/132245486        框架类 QFrame https://blog.csdn.net/u014491932/article/details/132188655           QMdiA

    2024年02月12日
    浏览(42)
  • 16-4_Qt 5.9 C++开发指南_Qt 应用程序的发布

    用 Qt 开发一个应用程序后,将应用程序提供给用户在其他计算机上使用就是应用程序的发布。应用程序发布一般会提供一个安装程序,将应用程序的可执行文件及需要的运行库安装到用户计算机上,即使用户计算机上没有安装 Qt 也能正常运行安装的程序。 Qt的应用程序发布

    2024年02月14日
    浏览(58)
  • Qt下开发基于QGIS的应用程序

    由于有在背景地图上进行动态轨迹(曲线)显示的需要,故采用Qt+QGIS的方案! Qt5.12.12,VS2015编译器,QGIS3.10.1。 在配置之前,电脑是新装机的系统,没有任何相关软件版本。 在Qt官网(https://download.qt.io/)或国内镜像网站(https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt)或网络搜索

    2024年02月14日
    浏览(58)
  • 基于SkyEye运行Qt:著名应用程序开发框架

    Qt是一个著名的跨平台的C++图形用户界面应用程序开发框架,目前包括Qt Creator、Qt Designer等等快速开发工具,还支持2D/3D图形渲染、OpenGL,允许真正的组件编程,是与GTK、MFC、OWL、ATL一样的图形界面库。使用Qt开发的软件可以做到一次开发、任意部署,相同的代码可以在任意支

    2024年04月22日
    浏览(59)
  • 14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

    Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议,如 HTTP、FTP、SNMP等,这些类主要是 QNetworkRequest、QNetworkReply和QNetworkAccessManager。 QNetworkRequest 类通过一个URL 地址发起网络协议请求,也保存网络请求的信息,目前支持 HTTP、FTP 和局部文件 URLs的下载或上传。 QNe

    2024年02月13日
    浏览(51)
  • 「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用Qt Creator创建一个小的Qt应用程序

    2024年02月06日
    浏览(57)
  • Qt 实现应用程序单实例

    目前使 Qt 运行一个实例有如下几种方式: 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出;这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。 2.文件锁 在程序运行的时候就在目录下创建一个文

    2024年02月10日
    浏览(42)
  • Qt应用程序中的 QApplication

    QApplication类是一个Qt框架中核心的应用程序类,它提供了管理应用程序的框架、事件循环和系统级配置的基础。在本文中,我们将详细介绍QApplication类的功能和应用场景。 通常,我们在主函数中创建 QApplication 对象。在创建时,我们可以指定一些命令行选项和特定于平台的参

    2024年02月15日
    浏览(38)
  • Qt Linux 环境中应用程序打包

    系统环境:Ubuntu20.04LTS 开发环境:Qt5.14.1 在进入程序部署打包之前,阅读官方的部署文档Deploy,通常情况下,我们在开发的时候,Qt Creator 的左下角构建模式为Debug,便于我们调试编写程序。Qt的三个构建模式Debug、Profile、Release的区别是: debug可以调试程序,而release不可以。在

    2024年02月01日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包