qt如何设计好布局和漂亮的界面。腾讯云开发者社区

​       曾几何时,我们都在黑框框下度过,我们受够了被黑框框支配的恐惧,想要跳出去,去看看外面,我们听够了类似于界面只是皮肤,背后的代码才是王道的话语,当你觉得黑框框已经满足不了你的时候,我觉得,你是时候做出一些改变了。如果你是学习C++的,我想qt可以作为你进入界面的一条选择,这篇文章,我们不讲函数,不讲类,总之就是不讲代码,我们来讲讲代码之外,聊一聊关于怎么布局,怎么用qt做出一个漂亮的界面❤️。​       我在一篇讲布局博文下面看到这样一句评论:为什么非要布局,直接自己摆不是更好吗?我相信很多刚接触布局的同学,都有这种想法,当然,当初的我和你们拥有一样的想法,但是现在,这种想法我不敢再有。之所以会说出这句话,要么是刚接触界面,要么是随手点了进来,阿巴阿巴看完评论了一句。刚开始接触界面,布局确实不是那么重要,我们的软件(都称不上是软件,就是一个空壳子)一共也没几个组件,两个按钮?三个文本框?刚接触的时候,你是否考虑过软件大小随意变化的问题,你是否考虑过后期添加组件,随着我们的软件越来越庞大,让组件自动分配空间显的尤为重要。

​       分为两大板块:布局和Qt版CSS,基础在前,进阶在后,前面讲布局组件以及css语法等等,后面进行实践,并就遇到的问题进行解决,看不完,建议先收藏起来,日后根据需求查看。使用的是Qt5.10.0版本,相关更详细的使用方法可点击下方官方文档查看❤️创作不易,您的点赞是我创造的动力。

​​

与布局有关的就是上图红色方块所标注的三项,下面依次做说明。

​Layouts这个词,一定不陌生,布局的意思,在第一个红框框里面有一共有4种布局类型,分别是Vertical Layouts(垂直布局),Horizontal Layouts(水平布局),Grid Layouts(网络布局),Form Layouts(窗体布局)。

使用了垂直布局,组件自动在垂直方向上分布。

使用了水平布局,组件自动在水平方向上分布。

使用了水平布局,组件自动在网格方向上分布。

和网格布局类似,但只有最右侧的一列网格会改变大小。

空间间隔器有两种,一种是水平的,另一种是垂直的。

Spacer有四个属性:

spacerName(名字)

orientation(决定spacer是水平间隔或垂直间隔)

sizeType(单独说)

sizeHint(该值是组件作为在布局管理器中部件的缺省大小,既建议值,也是缺省值,其他组件该值不可修改,但Spacer组件可修改,组件实际大小受部件的大小策略、sizeHint以及布局中其他部件的影响)

四个属性中,sizeType应该拿出来讲一讲:

sizeType属性说明

说明

Fixed

Minimum

GrowFlag

指定最小值策略: Qwidget. sizeHint()对应的缺省大小是最小值,不能调整部件大小到比缺省大小更小的尺寸,并且该值应该足够满足部件的展现。部件允许扩展,但是Qt并不建议扩展(例如:水平方向上的按钮)。

Maximum

ShrinkFlag

指定最大值策略: Qwidget. sizeHint()对应的缺省大小是最大值,假如其它部件需要空间并且不会破坏该部件,那么该部件允许被缩小(例如:-个分割线)。

Perferred

GrowFlag|ShrinkFlag

首选项策略: Qwidget sizeHint()对应的缺省大小是最佳效果,部件允许放大或缩小,但不建议扩展比sizeHint()大,该策略是缺省策略。

Expanding

GrowFlag|ShrinkFlag|ExpandFlag

扩展策略: Qwidget. sizeHint()对应的缺省大小是合理的大小,但部件允许缩小并且可用。部件可以利用额外的空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。

MinimumExpanding

GrowFlag|ExpandFlag

最小可扩展策略: Qwidget. sizeHint()对应的缺省大小是最小值,并且大小足够。部件允许使用额外空间,因此它将会得到尽可能多的空间(例如:水平方向上的滑块)。

Ignored

ShrinkFlag|GrowFlag|IgnoreFlag

不出意外的话,新人可能看不懂这个说明,用通俗易懂的话说就是这个样子的:

?Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。

?Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以放大。

?Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。

?Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小。

?Expandint:控件可以自行增大或者缩小。

?MinimumExpanding:控件的sizeHint是它的sizeHint,但是可以使用额外的空间,也就是它会尽可能得到更多的空间。

?Ignored:控件的sizeHint不起作用,它会尽可能得到更多的空间。

所以看到这里,千万不要再说你的Spacer不能设置大小。

前四个与我们本文关系不大,不与介绍,我们来看后面剩下的。

?Lay Out Horizontally:将窗体上所选组件水平布局?Lay Out Vertically:将窗体上所选组件垂直布局?Lay Out Horizontally in splitter:将窗体上所选组件用一个分割条进行水平分割布局?Lay Out Vertically in splitter:将窗体上所选组件用一个分割条进行垂直分割布局?Lay Out in a Form Layout:将窗体上所选组件窗体布局?Lay Out in a Grid:将窗体上所选组件网格布局?Break Layout:解除窗体上所选组件的布局,也就是打破布局。?Adjust Size:自动调整所选组件的大小。

这时候,你可能要问这里的布局和刚才的布局一样吗,是一样的,在不过在这里,可以更快速的对组件进行布局,比如下面这样:

至于分割布局器,默认情况下是不可用,使用方法是先选中要放入QSplitter中的控件,此时分裂布局图标变亮,然后选择水平或垂直布局器。

使用属性中的handleWidth可调节组件之间的间距。属性中的opaqueResize默认情况下(打勾),使用鼠标拖动分割子窗口间的边界时,子窗口会动态的改变其大小。然而,如果希望在松开鼠标时才改变其大小,可以设置下面的参数,取消其勾选状态即可,效果如下(左面打勾):

​       Qt自带一个纯天然的皮肤功能QSS,也就是Qt版CSS。就算没有美工你也能轻松做出酷炫的界面,完整的官方文档可查看文字开头蓝色链接,这里仅常用的语法做一个引入。

不知你是否经历过在一个界面设置背景图片,但界面上的组件,例如按钮的背景也会被设置为该背景图,如下图所示,这是由于选择器导致的问题。

图中的frame 被称为选择器,表示样式表的设置仅对该选择器有效。上图的frame是一个窗体的对象名,选择器若为具体的类实例对象名,应在前面使用#来表示,也可将图中的#frame改为QFrame(类型名),区别是前者仅对具体的一个窗体起作用效果,而后者是所有QFrame类及其子类都有效果。除此之外,还有以下选择器:

?QPushButton[flat=“false”]:匹配非flat的QPushButton实例。

?.QPushButton:匹配QPushButton的实例,但不匹配其子类,注意前面的点。

?QPushButton#okButton:匹配对象名称为okButton的所有QPushButton实例。

?QDialog QPushButton:匹配所有QPushButton实例,这些实例是QDialog的后代(子代等)。

?QDialog > QPushButton:匹配所有QPushButton实例,这些实例是QDialog的直接子代。

如果你照上面做了,按钮的字体颜色未编译下是可以看到的,而按钮背景可能不会显示,必须编译后才可以显示,这时可以加一句border-radius:0px;,这样按钮的背景色就会显示出来,具体原因不是很清楚。而border-radius:0px;的意思是边框圆角半径。随着数值越来越大,按钮也越来越圆润~~,如下图。

如上图QTabWidget组件,它的原型是下图,对于样式复杂的窗口组件(该组件又由几个小组件构成),必须访问窗口小部件的子控件,对其进行单独使用样式表,直接右键对QTabWidget使用样式表是不可用的。

例如,红色的是小部件是tab,QTabBar或QToolBox的选项卡,而蓝色的是pane,QTabWidget的窗格(框架),想达到图中效果,就需要分别设置样式表。

伪状态是干什么的呢,就是用于界面动态效果,用来检测一系列动作,例如鼠标悬停在按钮上,鼠标按下去,这样一系列动作所产生的动态效果。

效果可能过大了哈,为了演示,这都不重要。

? 悬停:hover? 不悬停:!hover? 悬停并选中 :hover:checked?悬停并按下:hover:!pressed

如果想修改图中输入框的边框颜色可以使用

前提是将边框的风格定义为以下类型(默认类型是none,无边框,即使用了边框颜色也不会显示):

?none 定义无边框。?hidden 与 “none” 相同。不过应用于表时除外,对于表,hidden 用于解决边框冲突。?dotted 定义点状边框。在大多数浏览器中呈现为实线。?dashed 定义虚线。在大多数浏览器中呈现为实线。?solid 定义实线。?double 定义双线。双线的宽度等于 border-width 的值。?groove 定义 3D 凹槽边框。其效果取决于 border-color 的值。?ridge 定义 3D 垄状边框。其效果取决于 border-color 的值。?inset 定义 3D inset 边框。其效果取决于 border-color 的值。?outset 定义 3D outset 边框。其效果取决于 border-color 的值。

THE END
0.图像分割—学习笔记图像分割是什么用水平集函数表示曲线 变分法得到欧拉-拉格朗日公式 迭代法解偏微分方程 图像导入 图像分割 图像分割(segmentation)是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。图像分割的jvzquC41dnuh0lxfp0tfv8xvwffdx~1ctzjeuj1fgzbkux1;4?94=82
1.pythonnumpy数组的组合和分割实例python数组的分割主要有: 1.水平分割:np.split(arr,n,axis=1) 或 np.hsplit(arr,n) 2.垂直分割:np.split(arr,n,axis=0) 或 np.vsplit(arr,n) 3.深度分割:np.dsplit(arr,n) 接下来一一举例 一、数组的组合 1.水平组合 语法: np.hstack(arr1,arr2) concatenate(arr1,arrjvzquC41yy}/lk:30pku1jwvkerf1:=3457/j}r
2.了解RIP路由防环水平分割(Split Horizon)的原理是,RIP路由设备从某个接口学到的路由不会从该接口再发回给邻居路由设备。这样不但减少了带宽消耗,还可以防止路由环路。 图11-7 按照接口进行水平分割原理图 如图11-7所示,DeviceA会向DeviceB发送到网络10.0.0.0/8的路由信息,如果没有配置水平分割,DeviceB会将从RouterA学习到的这条jvzquC41uwvqq{y0jwgxgr3eqo5fp}jtrtotg8j1fud1NIQE3712;<:49<03>>33:k
3.HCIE11.EVPN路由在CE多归接入到PE场景下,如果CE的链路为ALL-Active模式,CE发送一个PE的BUM报文可能被另一个PE环回,所以需要水平分割解决这个问题。 水平分割由所有PE通告携带ESI Label扩展团体属性的Ethernet A-D per ES route实现。 Ethernet A-D per EVI route(无扩展标签) jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:88358:
4.20210120104426.md·Mre/myimg[RTA-Serial6/0]undo rip split-horizon // 关闭水平分割功能 由以上输出可知,在水平分割功能关闭的情况下,RTA在接口Serial6/0上发送的路由更新包含了路由 2.2.2.2 。也就是说,路由器把从接口Serial6/0学到的路由 又从该接口发送了出去。这样容易造成路由环路另外一种避免环路的方法是毒性逆转。在RTA的接口SerijvzquC41ikzfg7hqo1ss/n4o{ksh1kqqd1sbu}jt1463396423656;;0of
5.采用变分水平集形式用于图像分割(Matlab代码实现)本文提出了一种基于区域的主动轮廓模型,采用变分水平集形式用于图像分割。在我们的模型中,局部图像强度由具有不同均值和方差的高斯分布描述。我们定义了一个局部高斯分布拟合能量,其中包含一个水平集函数和局部均值和方差作为变量。能量最小化通过交替进行水平集演化和估计局部强度均值和方差的迭代过程来实现。局部强度的均值jvzquC41dnuh0lxfp0tfv8|gkzooa=;25;=2;8ftvkimg8igvcomu86738=4::<
6.图像分割水平集算法水平集分割图像的原理知乎水平集关键 :曲线的演变 首先设置一个初始轮廓,也就是初始轮廓,通过将这个初始轮廓演变成图像中需要分割出来的形状,那具体是如何演变的呢 ?我用自己的理解来解释一下: 既然曲线在演变,那曲线的每一个点一定有一个演化的方向,如何确定演化方向? 用最优方向,也就是梯度方向的法线方向,因为曲线沿这个方向变化最快 jvzquC41dnuh0lxfp0tfv8vsa5=78A69;1gsvrhng1jfvjnnu1735<=6:4>
7.Markdown语法快速入门手册Horizontal Rules 水平分割线: *** *-- - Escape character 转义符(反斜杠): Markdown 可以利用反斜杠来插入一些在语法中有其它意义的符号,例如:如果你想要用星号加在文字旁边的方式来做出强调效果,你可以在星号的前面加上反斜杠: \*字面星号\* MarkjvzquC41yy}/y
8.LATE水平集图像分割模型的矩形窄带法①  E-mail: csa@iscas.ac.cn http://www.c-s-a.org.cn Tel: +86-10-62661041   LATE 水平集图像分割模型的矩形窄带法① 曾笑云1,  杨晟院1,  潘园园1,  刘 洋1,  左国才2 1(湘潭大学 信息工程学院, 湘潭 411105) 2(湖南软件职业学院 软件与信息工程学院,jvzquC41e/y.c7tti0io1lxc1cxuklqg1rjg1@638
9.我国草种业发展的问题及对策据证券日报网报道,2021年上半年蒙草公司研发投入8632.65万元,同比增长456.93%,占上半年营业额约8.80%,已达近年来的最高投入水平;而同年,德国拜耳研发投入占总收入约12.17%,2020年约占10.40%,均领先于国内草种企业研发投入最高水平。 2.4产业链条分割 不论是县域模式还是区域模式,产业链条的联系都不紧密,表现为育、jvzq<84yyy4junsnkp4dp8xha676H@I95:HF:=
10.智能数据分析研究团队3.图像分割的水平集方法研究 图像分割是近年来比较热门的方向,课题组探索并建立snake模型、基于图像边界特征(edge-based)的活动轮廓和基于图像区域特征(region-based)的活动轮廓等一系列活动轮廓图像分割方法,解决医学图像和自然光图像等复杂内容图像的分割问题。 jvzquC41oczi0qwdgw4ff~3ep1oohx4325:03A590jzn
11.产业发展的建议汇总十篇生物企业规模普遍较小,主要是中小型企业,缺少拥有国际领先技术水平和实力雄厚的龙头企业,研发投入严重不足,产品缺乏创新,技术含量低,特别是生物医药产品90%为仿制品。不仅如此,目前我国生物与医药园区分散、分割、低水平重复问题还比较突出,产业结构不合理,产业布局分散,大多数园区远未形成专业化分工的产业集聚效应。jvzquC41yy}/z~jujw4dqv3ep1nbq€jp16768:3jvor
12.python中opencv实现文字分割的实践python对文字图片作横向和纵向投影,即通过统计出每一行像素个数,和每一列像素个数,来分割文字。 分别在水平和垂直方向对预处理(二值化)的图像某一种像素进行统计,对于二值化图像非黑即白,我们通过对其中的白点或者黑点进行统计,根据统计结果就可以判断出每一行的上下边界以及每一列的左右边界,从而实现分割的目的。 jvzquC41yy}/lk:30pku1jwvkerf1;6633
13.OpenCV(python)版实现文本分割之水平投影法python在文本分割领域中有一种很优秀的算法:投影法,包括水平投影法和垂直投影法。本文主要讲述水平投影法,水平投影法可以理解为一束光线从图像的左侧向右边进行照射,每一条光线可以理解为图像的一行,计算每一行上图像的黑色像素点,从而可以对图像进行分割。 1 jvzquC41yy}/lk:30pku1jwvkerf1;:9:6?/j}r
14.华为、H3C、思科命令对比,思维导图形式从基础、交换、路由三大代码语言:txt AI代码解释 display 新华三 代码语言:txt AI代码解释 display 3.退回上级 思科 代码语言:txt AI代码解释 exit 华为 代码语言:txt AI代码解释 quit 新华三 代码语言:txt AI代码解释 quit 4.设置主机名 思科 代码语言:txt AI代码解释 hostname jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk04987469