QT UI布局设置汇总

一、设置边距的方法

1、设置容器边框和内部控件的边距

a)、可以通过设置setContentsMargins方法

 //设置容器myQwidget(QWidget)内部margin
 ui->myQwidget->setContentsMargins(10,10,0,0);

 如上图,外面的是myQwidget,内部假设是一个填满的button,那么设置setContentsMargin,可以控制left和top,right,bottom等四个边距的距离。

b)、也可以使用layoutLeftMargin等属性。

ui->editWidget->layout()->layoutLeftMargin=10; //使用这些属性,和setContentsMargins方法等价

2、 设置内部控件之间的间距

//editWidget是一个QWidget
ui->editWidget->layout()->setSpacing(0);

这个可以设置容器内部控件之间相隔的间距,一般用于内部空间比较少的情况,内部控件一多,就不好控制

在设计器中,如下图中的layoutSpacing属性:

 注:图1

3、设置部分控件的间距

如下图:

这个大的qwidget中有一大堆控件,当设置layoutSpacing 可以设置每个控件之间的间距。

但是如果只想让“左侧btn”和“时间label”的间距放大,应该如何设置?

解决方案:选中“左侧btn”和“时间label”,然后右键设置布局。前提是将外部的qwidget的布局先取消。

再通过对上一层layout设置layoutSpacing即可。结构如图:

四、将空间撑开,维持spliter的默认比例宽度

背景:我在一个splitter中放了左右两个控件,同时在代码中设置了默认的宽度比例。

ui->mainSplitter->setStretchFactor(0,5); //代表第0个控件,即左边所占比例为2
ui->mainSplitter->setStretchFactor(1,4); //代表第1个控件,即右边所占比例为7.一共是9

但是不起作用,左边的控件会被压缩。尝试过几种方法,包括把左侧空间控件的sizepolicy设置成expanding,也无效

愿意是我的控件长这样,选中的这部分为左侧控件。如下图:

 若想让左右两边的比例符合代码设置的预期。其实就是要让左侧控件的内容能够撑开。

有一个办法是设置左侧控件的最小宽度,这样确实能够解决问题,但是会导致splitter无法拖动了。

所以解决方案是将中间水平的这个spacer占位弹簧的sizeHint属性中的宽度设置为200。如下图:

 这样就达到了目的。

spacer占位弹簧的sizeHint 是一个非常重要的属性,它在 Qt 中用于布局管理。当您的窗口或者布局需要重新调整大小或者重新布局时,Qt 会参考每个控件的 sizeHint 来决定它们的理想大小。

对于 Spacer 控件,sizeHint 属性定义了其理想的宽度和高度。由于 Spacer 是一个占位符控件,它通常用于填充布局中的额外空间或者推动其他控件改变位置。因此,它的 sizeHint 属性通常用于控制它的 "弹性" 或者 "空间占用"。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力为您解答。首先,让我们来了解一下凑硬币问题。 在凑硬币问题中,我们需要找到最少的硬币数来凑成给定的金额。例如,如果我们需要凑成 11 元,而有 1 元、2 元、5 元三种不同面值的硬币可供使用,那么最少需要使用 3 枚硬币,即 5 元、5 元和 1 元。 下面是一种使用动态规划解决凑硬币问题的方法: 1. 创建一个长度为 amount+1 的数组 dp,其中 dp[i] 表示凑成面值为 i 元所需的最少硬币数。 2. 初始化 dp[0] 为 0,其余元素初始化为一个较大的数(例如 amount+1),表示当前面值无法被凑成。 3. 遍历硬币数组 coins,对于每个硬币,遍历 dp 数组,更新 dp[j] 的值为 dp[j-coins[i]]+1,其中 j>=coins[i],表示当前面值可以被凑成。 4. 最终 dp[amount] 就是凑成 amount 元所需的最少硬币数,如果 dp[amount]>amount,则表示无法凑成给定金额。 下面是使用 JavaScript 实现该算法的代码: ```javascript function coinChange(coins, amount) { const dp = new Array(amount + 1).fill(amount + 1); dp[0] = 0; for (let i = 0; i < coins.length; i++) { for (let j = coins[i]; j <= amount; j++) { dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); } } return dp[amount] > amount ? -1 : dp[amount]; } ``` 这个函数接受两个参数,一个是硬币数组 coins,另一个是需要凑成的金额 amount。最终返回凑成 amount 元所需的最少硬币数,如果无法凑成则返回 -1。 例如,若 coins = [1, 2, 5],amount = 11,则 coinChange(coins, amount) 的返回值为 3,表示凑成 11 元最少需要 3 枚硬币。 希望这个简单的解释和代码能够帮到您,如果您还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值