• 9229阅读
  • 8回复

[提问]百思不得其解,setContentsMargins函数对QCheckBox不起作用 [复制链接]

上一主题 下一主题
离线stlcours
 

只看楼主 倒序阅读 楼主  发表于: 2015-02-06


    test_label = new QLabel(); test_edit = new QLineEdit();    test_check = new QCheckBox();    

    QVBoxLayout *main_layout = new QVBoxLayout();
    main_layout->addLayout(user_layout);
    main_layout->addLayout(pass_layout);
    main_layout->addWidget(test_check);
    main_layout->addStretch();
    main_layout->setSpacing(15);
    main_layout->setContentsMargins(40, 20, 20, 20);
    test_check->setContentsMargins(50, 100, 50, 50); // 为什么check不可以,label edit都没有问题


test_label->setContentsMargins(50, 100, 50, 50); 起作用
test_edit->setContentsMargins(50, 100, 50, 50); 起作用
test_check->setContentsMargins(50, 100, 50, 50); 不起作用,它会整整齐齐的左上角对齐,仿佛什么事情都没发生过一样
这是为什么?

我想要的效果是:就是让checkbox在layout中缩进一下。label和edit就可以这样设置,但check不行 。
离线dbzhang800

只看该作者 1楼 发表于: 2015-02-07
多看看Manul,而后不用“百思”就“可得其解”

void QWidget::setContentsMargins(int left, int top, int right, int bottom)

Sets the margins around the contents of the widget to have the sizes left, top, right, and bottom. The margins are used by the layout system, and may be used by subclasses to specify the area to draw in (e.g. excluding the frame).

QCheckBox 是常态行为,而QLabel和QLineEdit是"and may be"提到的行为。
离线stlcours

只看该作者 2楼 发表于: 2015-02-09
是不是说反了,应该是QCheckBox 是may be,QLabel是常态行为?

话说回来,为什么要这样做呢?既然在QWidget就提供了这个功能,子类为什么不保持统一呢?
离线roywillow

只看该作者 3楼 发表于: 2015-02-09
回 stlcours 的帖子
stlcours:是不是说反了,应该是QCheckBox 是may be,QLabel是常态行为?
话说回来,为什么要这样做呢?既然在QWidget就提供了这个功能,子类为什么不保持统一呢? (2015-02-09 16:49) 

这个函数主要是为layout准备的,layout也有同名的函数与它对应
而widget到底用不用这四个数据完全取决于widget自己的实现
因为label是可以有边框的,所以会存在margin,因此得考虑这四个参数
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 4楼 发表于: 2015-02-09
回 stlcours 的帖子
stlcours:是不是说反了,应该是QCheckBox 是may be,QLabel是常态行为?
话说回来,为什么要这样做呢?既然在QWidget就提供了这个功能,子类为什么不保持统一呢? (2015-02-09 16:49) 

呵呵,没说反。因为它压根就不是用于你这种场合的。

考虑你有一个Widget,然后为其 setLayout(),那么 layout 管控的区域多大,这就是一个问题了, 对吧?? setContentsMargins 就是干这么用的。


离线stlcours

只看该作者 5楼 发表于: 2015-02-10
回 dbzhang800 的帖子
dbzhang800:呵呵,没说反。因为它压根就不是用于你这种场合的。
考虑你有一个Widget,然后为其 setLayout(),那么 layout 管控的区域多大,这就是一个问题了, 对吧?? setContentsMargins 就是干这么用的。
....... (2015-02-09 22:39)

纯技术讨论,不要生气:

什么叫做“压根就不是用于你这种场合的”?它既然在父类里就提供了这个函数,那么只要程序不崩溃并部分达到我的效果,我就可以随便使用。就像windows api提供了hook,那么好事坏事随便做,只要你用得上这些技术。
怕是你自己不习惯这样使用,所以才这样说的吧。
离线stlcours

只看该作者 6楼 发表于: 2015-02-10
回 roywillow 的帖子
roywillow:这个函数主要是为layout准备的,layout也有同名的函数与它对应
而widget到底用不用这四个数据完全取决于widget自己的实现
因为label是可以有边框的,所以会存在margin,因此得考虑这四个参数 (2015-02-09 18:57) 

这个解释有些说服力,我查了一下,QLabel和QLineEdit确实都有margin。但是QCheckBox没有,不过话说回来,QCheckBox为什么就没有呢?给QCheckBox套一个边框不也是很正常的事情吗?
离线roywillow

只看该作者 7楼 发表于: 2015-02-10
回 stlcours 的帖子
stlcours:这个解释有些说服力,我查了一下,QLabel和QLineEdit确实都有margin。但是QCheckBox没有,不过话说回来,QCheckBox为什么就没有呢?给QCheckBox套一个边框不也是很正常的事情吗? (2015-02-10 18:15) 

……………………是么……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线stlcours

只看该作者 8楼 发表于: 2015-02-10
回 roywillow 的帖子
roywillow:……………………是么…… (2015-02-10 21:08) 

是啊。我对Delphi的控件用的很熟。Delphi里还特别强调属性的概念,但是边框对CheckBox是一视同仁的。不过接触QT半年了,觉得他们也很厉害,开发类做的很完善,我想还是有什么地方我没有想到吧。
快速回复
限100 字节
 
上一个 下一个