写点什么

C++ 中变化布局实现思路

  • 2022-10-19
    河北
  • 本文字数:1501 字

    阅读完需:约 1 分钟

C++中变化布局实现思路

前些日子给我安排了一个说轻松又繁琐的工作,整理离职人员的代码。因为项目需求不同分裂出了很多个版本,但核心是不变的,现在需要将多个版本合并成一个版本。


说实话,这个工作很麻烦,首先很多程序员估计跟我的想法是一致的,不喜欢读别人的代码,尤其是代码写的还不规范,简直一团火在胸腔内熊熊燃烧!


今天,我就来更新下整合过程中遇到的一个有意思的功能,根据需求不同,展示不同的画面。大白话就是对整个展示页面进行布局变化,那么,首先来看一下最终的实现效果吧!


以下是我重新为讲解功能做的一个 demo。

功能讲解:

当前例子只是显示各个 widget 的布局操作。

左上角 4 个 widget 控制,默认右侧的 4 个窗口全部显示。隐藏指定的 widget 后,对应的布局也就随之变化。


那么,这 4 个窗口一共有哪些布局方式呢?下面表格中列举了所有的展示情况

上述图片上一共展示了 14 种效果,我们在程序中该如何区分呢?难道是定义 14 个变量进行区分么?


其实,对于初级程序员来说,这个方法是最可取的也是最方便的。随着我们对代码编写的熟练程度以及代码经验的积累,这种方式我们会逐渐抛弃的。

接下来,这篇文章的重点来了:如何管理布局展示!

大家有没有发现这样一个现象,我们无论是在 MFC 框架还是在 Qt 框架下,系统中的风格或者是标识,全都采用了 0x0001 依次递增的方式呢?


这种方式定义清晰明了,使用起来方便,用简单的枚举类型就可以解决了。

enum ENUM_WidgetLayout{	WidgetLayout_Widget1,	WidgetLayout_Widget2,	WidgetLayout_Widget3,	WidgetLayout_Widget4,};
复制代码

上述我才用了枚举类型,定义了四个不同页面的标识,用于区分。


单纯的查看枚举类型如何写出这 14 种不同的布局呢?此时,使用默认的枚举数值就不能实现了。


为了我们定义简单,使用方便,我们采用了进制的方式进行区分,对于不同的枚举类型,占位也各不相同,在我们后续应用时,也会更加方便。对上述枚举的修改,如下

//界面布局enum ENUM_WidgetLayout{	WidgetLayout_Widget1 = 0x00000001,	WidgetLayout_Widget2 = 0x00000010,	WidgetLayout_Widget3 = 0x00000100,	WidgetLayout_Widget4 = 0x00001000,};
复制代码

由此分配数值,无论是哪种情况的组合,都不会重复,也不需要我们手动定义,让计算机来帮助我们完成这样内容。


程序中,我们定义一个 int 类型的变量,假设叫做:m_nWidgetLayout,用于存储计算后的数值,也就是不同窗口的任意组合。下面我只是列举几个,具体的大家可以详细写明

void QtChangeLayoutWidget::UpdateWidgetLayout(int nLayoutStyle){	switch (nLayoutStyle)	{	case WidgetLayout_Widget1:	{		//只显示widget1风格	}	break;	case WidgetLayout_Widget1 + WidgetLayout_Widget2:	{		//只显示widget1 + widget2组合风格	}	break;	case WidgetLayout_Widget1 + WidgetLayout_Widget2 + WidgetLayout_Widget3:	{		//只显示widget1 + widget2 + widget3 组合鞥个	}	break;	case WidgetLayout_Widget1 + WidgetLayout_Widget2 + WidgetLayout_Widget3 + WidgetLayout_Widget4:	{		//全部展示:widget1 + widget2 + widget3 + widget4
} break; }}
复制代码

在上述代码中,可以根据不同的风格设置不同的展示页面。

那么,这些风格是如何赋值到?

说白了,其实是我们如何对 int 类型的风格数据进行赋值的,此时,我们学到的标准 C++ &操作、|操作就起到作用了。

添加一个 widget

m_nWidgetLayout |= WidgetLayout_Widget1;
复制代码

隐藏一个 widget

m_nWidgetLayout &= (~WidgetLayout_Widget1);
复制代码

对于我们四个 widget 窗口都采用这种方式,让计算机来进行自己计算,省的我们在自己在拼接两个枚举时出现错误!


今天对布局的讲解任务就到这里了!


我是中国好公民 st,一名 c++开发程序猿~

发布于: 刚刚阅读数: 3
用户头像

书山有路勤为径,学海无涯苦作舟 2022-07-01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
C++中变化布局实现思路_c++_中国好公民st_InfoQ写作社区