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

575 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

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

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

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

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

widget布局.gif

功能讲解:

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

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

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

布局情况.png

上述图片上一共展示了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++开发程序猿~