Qt中QMainWindow主窗口布局注意点

Qt中QMainWindow主窗口布局注意点

1、当使用布局的时候,构建子控件的时候不需要指定parent,布局将会自动的指定parent(使用QWidget::setParent()),使它们成为安装了该布局的界面的子控件。

布局中的控件是安装了该布局的界面的子控件,而非布局自身的,控件只能以控件作为parent,不能是布局

也可以在布局中使用addLayout()来添加布局,内部的布局就会变成它的子布局

2、若用设计器布局主窗口,生成的代码布局类对象的构造函数参数parent为ui->centralWidget(即中心工作区窗口)。

3、若用手动编写主窗口布局,则其布局类对象的构造函数参数parent需设置为this(即QMainWindow等)。布局在主窗口,如this->setLayout(m_totalHLayout);注意:手动布局主窗口不是对工作区布局。

代码参考如下:

void MainDialog::initUI()
{
    m_totalHLayout = new QHBoxLayout(this);
    m_totalHLayout->setSpacing(0);
    m_totalHLayout->setObjectName(QString::fromUtf8("m_totalHLayout"));
    m_totalHLayout->setContentsMargins(0, 0, 0, 0);
    this->setLayout(m_totalHLayout);

    m_leftSiderBarWidget = new LeftsiderbarWidget(ui->centralwidget);
    m_leftSiderBarWidget->setObjectName(QString::fromUtf8("m_leftSiderBarWidget"));
    m_leftSiderBarWidget->setGeometry(QRect(0, 0, 200, 640));

    m_totalHLayout->addWidget(m_leftSiderBarWidget);

    m_rightVLayout = new QVBoxLayout();
    m_rightVLayout->setObjectName(QString::fromUtf8("m_rightVLayout"));
    m_rightVLayout->setContentsMargins(0, 0, 0, 0);

    m_titleWidget = new QWidget(ui->centralwidget);
    m_titleWidget->setObjectName(QString::fromUtf8("m_titleWidget"));
    m_titleWidget->setGeometry(QRect(201, 0, 760, 40));
    m_rightVLayout->addWidget(m_titleWidget);

    m_stackedWidget = new QStackedWidget(ui->centralwidget);
    m_stackedWidget->setObjectName(QString::fromUtf8("m_stackedWidget"));
    m_stackedWidget->setGeometry(QRect(201, 41, 760, 40));
    m_rightVLayout->addWidget(m_stackedWidget);

    m_totalHLayout->addLayout(m_rightVLayout);

    initTileBar();
    initLeftsideBar();
    initStyleSheet();
}

为布局添加控件

当添加一个控件到一个布局中,布局过程工作如下:

    1、 所有的控件将最初根据它们的 QWidget::sizePolicy()和QWidget::sizeHint()而被分配到一定空间中。

    2、 如果任何一个控件有一个伸展因素设置,而且数值大于零,那么它们就会被根据它们的伸展因素的比例分配空间。

    3、 如果任何一个控件有一个伸展因素设置而且数值为零,那么只有当其它控件不再需要空间的时候才会得到更多的空间。在这当中,空间会首先被根据延展大小策略分配给控件。

    4、 任何控件被分配的空间的大小如果小于它们的最小大小(或者是在没有规定最小大小时的最小大小的提示),它们就会被按它们所需要的最小大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最小大小或者最小大小的提示。)

    5、 任何控件被分配的空间的大小如果大于它们的最大大小,它们就会被按它们所需要的最大大小分配空间。(如果控件的伸展因素是它们的决定因素的情况下,它们不必有最大大小。)
 

布局中自定义控件

当你创建自己的控件类时,也应该传递它的布局属性。如果这个控件有一个QLayout,这样的话就已经被处理了。如果这个控件不包括任何子控件,或者使用自定义布局,需要重新实现下面这些QWidget的成员函数:

  •     QWidget::sizeHint() 返回控件的优先选用的大小。
  •     QWidget::minimumSizeHint() 返回控件所能有的最小大小。
  •     QWidget::setSizePolicy() 指定控件所需要的空间。

只要大小提示、最小大小提示或者大小策略发生改变,都要调用QWidget::updateGeometry()。这会引起布局的重新计算。对updateGeometry()的多重调用只会引起一次重新计算。

如果你的控件的优先选用的高度依赖于它的实际宽度(比如一个自动断词的标签),在sizePolicy()中设置hasHeightForWidth()标记,并且重新实现QWidget::heightForWidth()。

即使你实现了heightForWidth(),提供一个好的sizeHint()仍然是必需的。

进一步实现,请参考:Trading Height for Width.。
 

手动布局

如果要生成一种特殊的布局,也可以按上面的描述来生成一个自定义控件。重新实现QWidget::resizeEvent()来计算所需要分配的大小并且给每一个子控件调用setGeometry()。

当布局需要重新计算的时候,控件会得到一个类型是QEvent::LayoutRequest的事件。重新实现被通知QEvent::LayoutRequest事件的QWidget::event()。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值