Qt学习_11_构建内嵌子界面与独立子界面的框架

这篇具有很好参考价值的文章主要介绍了Qt学习_11_构建内嵌子界面与独立子界面的框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 前言

对于较大的Qt项目而言,弹出的独立子界面 与 根据菜单在主窗口内切换的内嵌子界面是我们所必须面对的问题。那么在项目框架对这两部分内容应该如何布局,才能让项目更清爽更规整。是本文着重讨论的内容。下图给出我们的最终设计框架。

Qt学习_11_构建内嵌子界面与独立子界面的框架

1 正文

1.1 独立子界面

1.1.1 创建

首先介绍独立子界面在项目中是如何被一步步创建的。

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

如上图所示点击完成按钮后,项目中就会生成 about.h about.cpp about.ui三个文件。

Qt学习_11_构建内嵌子界面与独立子界面的框架

 一个项目中,可能会存在多个独立子界面,而所有与独立子界面相关的文件都被放到了IndependentSubUI文件夹下。这样做的好处是项目开发过程自己思路更清晰,他人阅读时祖宗被问候概率大幅下降。

1.1.2 使用

为了更好的介绍如何使用刚刚创建的子界面, 假设我们项目有一个需求,点击主界面的一个按钮,然后弹出刚才创建的子界面。

首先,在主界面放一个按钮

Qt学习_11_构建内嵌子界面与独立子界面的框架

然后 转到槽…

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架 Qt学习_11_构建内嵌子界面与独立子界面的框架

运行结果,如下:

Qt学习_11_构建内嵌子界面与独立子界面的框架

1.1.3 高级

前面1.1.1和1.1.2已经把最基本的内容说明白了, 本小节主要是补充一些大家都可能会需要注意的问题,比如

Qt学习_11_构建内嵌子界面与独立子界面的框架

1.1.3.1 模态对话框(阻塞)

有一个种解决办法,就是把它的窗口模态类型设置成模态

void SubUIExample::on_pushButton_clicked()
{
    IndependetnSubUi_About = new About();
    IndependetnSubUi_About->setWindowModality(Qt::ApplicationModal);
    // Qt::ApplicationModal 模态
    // Qt::WindowModality   半模态
    // Qt::Qt::NonModal     非模态
    IndependetnSubUi_About->show();
}

 运行效果:

Qt学习_11_构建内嵌子界面与独立子界面的框架

但这样做的坏处是,程序其他所有的功能我都不能用了,这有可能并不是我们所想要的。

1.1.3.2 非模态唯一对话框(并行)

如果从线程角度来讲,模态对话框实际上是线程阻塞的,也就是子对话框是一个线程,但是在创建这个子线程之后,父窗口就阻塞了;而非模态对话框则不是阻塞型的线程模型,父子线程可以并行运行

下面介绍的另一种办法,实现非阻塞式唯一子窗口。

刚刚成员变量的取名有点冗长,我换一种取名方式,在主窗口类.h声明两个成员变量

About * m_About;
QPointer<About> m_About_ptr = nullptr;

m是member的缩写。

非阻塞式的需要用到一个指针 m_About_ptr,根据指针是否为空,判断是否new一个新的独立子窗口。

void SubUIExample::on_pushButton_clicked()
{
    if(m_About_ptr == nullptr){
        m_About     = new About();
        m_About_ptr = m_About;
        m_About->setAttribute(Qt::WA_DeleteOnClose);
        m_About->show();
    }else{
        m_About = m_About_ptr.data();

        // 若子窗口已被最小化、最大化或未置于顶层,令其恢复正常显示,并且让焦点落在这个窗口里
        m_About->hide();
        m_About->showNormal();
    }
}

着重注意 m_About->setAttribute(Qt::WA_DeleteOnClose);这一行感觉挺重要

如果widget设置了Qt::WA_DeleteOnClose属性,当子窗口被关闭时,widget将会被释放。也就是m_About_ptr将会变成为空指针nullptr,不管widget是否可见,关闭事件都会传递给widget。即接收到QCloseEvent事件后,除了调用hide()方法将窗口隐藏,同时会调用deleteLater()方法将窗口释放掉,不会再占用资源。

调用close()不一定就会将窗口对象销毁。而只有设置了 Qt::WA_DeleteOnClose属性才会删除销毁。如果这个属性没有设置,close()的作用和hide(),setvisiblefalse)一样,只会隐藏窗口对象而已,并不会销毁该对象。

换句话说,如果没有这一行代码,你关闭了子窗口后,有可能打不开了。因为这个时候m_About_ptr不为空指针nullptr

1.1.3.3 关闭主窗口时同时关闭子窗口

另外,如果我要在关闭主窗口的时候,把独立非阻塞子窗口也关闭

在子窗口类的构造函数添加一行

this->setAttribute(Qt::WA_QuitOnClose,false);

在主窗口类的构造函数添加一行

this->setAttribute(Qt::WA_QuitOnClose,true);

1.2 内嵌子界面

内嵌子界面主要是为了实现类似网易云音乐的界面框架。如下图所示

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

左边是菜单,右边是对应不同菜单的内容。

本文想实现的是,主窗口右边嵌入的每个不同子界面,都对应一个独立的 .h .cpp 和 .ui。这会使后续开发和维护更便捷,因为这种方式会让你更容易定位你想要设计或修改的内容。

1.2.1 创建

首先创建3个内嵌子界面的类,操作和1.1.1类似,不过我们选择的文件夹不再是 IndependentSubUI,而是EmbeddedSubUI。

Qt学习_11_构建内嵌子界面与独立子界面的框架

 Qt学习_11_构建内嵌子界面与独立子界面的框架

 Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

 打开主窗口ui(subuiexample.ui)添加三个按钮用于跳转页面,

Qt学习_11_构建内嵌子界面与独立子界面的框架

1.2.2 关联

要实现本小节开篇所提的功能,我们需要使用Stacked Widget这个Container(容器)。然后把1.2.1创建的三个内嵌子界面,与Stacked Widget控件的3个页面关联上。

Qt学习_11_构建内嵌子界面与独立子界面的框架

下面的操作很关键,就是如何把这三个页面,和我刚刚创建的三个内嵌子界面类关联上。

关联操作主要用到“提升为…”功能。

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

提升后, page的类就不再是QWidget,而是MyMusic了。

Qt学习_11_构建内嵌子界面与独立子界面的框架

依次再把 page_2和page_3也提升。

Qt学习_11_构建内嵌子界面与独立子界面的框架

1.2.3 切换 

Qt学习_11_构建内嵌子界面与独立子界面的框架

以作区分。

打开主窗口ui(subuiexample.ui),添加点击按钮的槽函数

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

然后添加切换代码。

Qt学习_11_构建内嵌子界面与独立子界面的框架

 下面给出修改方法。

Qt学习_11_构建内嵌子界面与独立子界面的框架

Qt学习_11_构建内嵌子界面与独立子界面的框架

 这下子清爽了。

最后看看运行效果:

Qt学习_11_构建内嵌子界面与独立子界面的框架

1.2.4 高级

内嵌子界面的框架已经搭好了,但是内嵌子界面的大小与stacked Widget的大小并不是一样大的, 如何让各内嵌子页面的大小保持一致,如何让它们随着主窗口的大小变化而变化。

这是本小节想要给出的内容。

未完待续…  或者CSDN大佬帮我补充一下,截图手都截软了。

2024-1-4补充:

补充说明一个很细节的东西,内嵌子界面在布局的时候不要做全局布局,可ctrl+A 选中所有元素来做一个布局。 否则会和主界面的全局布局产生冲突。

最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。文章来源地址https://www.toymoban.com/news/detail-434076.html

到了这里,关于Qt学习_11_构建内嵌子界面与独立子界面的框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue.js:构建用户界面的渐进式框架

    Vue.js是一种流行的JavaScript前端框架,用于构建用户界面。本文将介绍Vue.js的基本概念、特点、应用场景以及与其他框架的对比。 一、引言 在当今的前端开发领域,Vue.js已经成为了一个备受瞩目的框架。它的简洁、灵活和易于上手的特性使得开发人员能够快速高效地构建用户

    2024年01月23日
    浏览(57)
  • QT-通用的软件界面框架,好看且实用

    常规软件开发,使用这种界面框架,基本是可以做很多个常规项目,比较有参考意义。 本次软件使用开发的环境是QT5.13.2+VS2017,不同的开发环境重新配置即可。 1、软件框架结构说明,不同界面独立不同的库来调用。 2、属性配置 (1)添加包含目录:$(SolutionDir) (2)添加库

    2024年02月11日
    浏览(38)
  • 界面开发框架Qt - 组合小部件映射器示例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 Combo Widget Mapper(组合小部件映射器)示例展示了如何

    2023年04月14日
    浏览(45)
  • 深入了解Vue.js框架:构建现代化的用户界面

    目录 一.Vue前言介绍 二.Vue.js框架的核心功能与特性 三.MVVM的介绍  四.Vue的生命周期 五.库与框架的区别 1.库(Library): 2.框架(Framework): 六.Vue常用指令演示 1.v-model 2.v-on:click(简写:@click)     本篇博客将带你深入了解Vue.js框架的核心概念和强大功能 互关三连111 感谢大

    2024年02月07日
    浏览(51)
  • 基于SqlSugar的开发框架循序渐进介绍(28)-- 快速构建系统参数管理界面

    在参照一些行业系统软件的时候,发现一个做的挺不错的系统功能-系统参数管理,相当于把任何一个基础的系统参数碎片化进行管理,每次可以读取一个值进行管理,这样有利于我们快速的处理业务需求,是一个挺好的功能。本篇随笔模拟这个功能,基于SqlSugar开发框架的基

    2023年04月23日
    浏览(46)
  • 界面开发框架Qt新手入门教程:Dir视图使用实例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 本示例演示了树形视图的用

    2024年02月08日
    浏览(51)
  • [QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

    目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 上述示例代码中,首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你的应用程序需要图形界面,则使用 QApplication,否则使用 QCoreApplication。然后,你可以

    2024年02月15日
    浏览(52)
  • 界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 (Q技术交流:166830288) 树项

    2024年02月06日
    浏览(60)
  • C++界面开发框架Qt 6.x入门指南 - 拥有程序主窗口

    Qt技术交流群:166830288      欢迎一起进群讨论 点击获取Qt组件下载 Qt Widget 是桌面环境中典型的用户界面元素,这些小部件很好地集成到底层平台,在 Windows、Linux 和 macOS 上提供原生外观。 这些小部件成熟且具有丰富的用户界面元素,适用于大多数传统用户界面。 与 

    2024年02月05日
    浏览(47)
  • 80.qt qml-QianWindow炫酷界面框架-新增Canvas动态背景

    如下图所示:    动图如下所示: 如果我们使用图片,对于分辨率大的显示时,如果图片太小会失真,如果图片太大会占用很大内存,而且如果是动态图背景,那么至少40MB大小了. 所以我们增加Canvas动态背景功能,而且Canvas还可以根据系统性能我们来进行内部代码优化.比单色背景有趣的

    2024年02月05日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包